2013-05-07 2 views
2

Я использую скрипт powershell, который также нарисовал базовый интерфейс, чтобы упростить некоторые задачи. мне нужно связать определенное событие щелчка на кнопке элемента, и я использую этот кодудалить событие click на кнопку

$button_makeAction.add_Click({ 
    # my code 
}) 

Проблема заключается в том, что во время выполнения сценария, я хочу, чтобы связать эту кнопку с другим событием щелчка. Используя тот же код, он добавляет другое событие клика и выполняет оба действия, поэтому мне нужно что-то вроде $button_makeAction.reset_Click или $button_makeAction.set_Click, чтобы удалить первый код события. Правильно ли это?

ответ

1

Как насчет добавления оператора IF в обработчик события и выполнения кода на основе условия?

+0

это не то, что я имел в виду, но это решение, спасибо – Naigel

2

Зарегистрировать событие click с помощью Register-ObjectEvent. Таким образом, вы можете найти его позже и удалить. Пример:

#Create object and register event 
PS C:\> $button = New-Object system.windows.forms.button 
$event = Register-ObjectEvent -InputObject $button -EventName Click -Action { Write-Host "TestClick" } 

#Action is working 
PS C:\> $button.PerformClick() 

TestClick 

#Removing eventsubscriber 
PS C:\> Unregister-Event -SubscriptionId $event.id 

#Notice no output on next click 
PS C:\> $button.PerformClick() 
2

Используйте метод remove_Click (remove_MyEvent в приведенном ниже примере), и блок сценария хранится в переменной. Вот пример:

# A static class with a sample event 
Add-Type @' 
using System; 
public static class TestEvents { 
    public static event EventHandler MyEvent; 
    public static void InvokeEvent() 
    { 
     if (MyEvent != null) { 
      MyEvent(null, null); 
     } 
    } 
} 
'@ 

# Script used as event handler, it prints "In event handler." 
$script = { 
    Write-Host "In event handler." 
} 

# Add the script handler 
[TestEvents]::add_MyEvent($script) 

# Test: it writes "In event handler." 
[TestEvents]::InvokeEvent() 

# Remove the script handler 
[TestEvents]::remove_MyEvent($script) 

# Test: it does not write write "In event handler." because the handler has been removed 
[TestEvents]::InvokeEvent() 

Обратите внимание, что в PS V2 CTP3 была проблема 713174 , но это, кажется, решена, так что приведение к [EventHandler] даже не требуется. Но держите этот трюк в уме.

1

Вы могли бы сделать что-то вроде:

$Button.Add_Click({If ($Button.Tag) {Invoke-Command $Button.Tag}}) 

Затем установите динамическое событие в свойстве тега, как:

$Button.Tag = {MyCode} 
Смежные вопросы