2013-05-07 168 views
2

我正在使用一個PowerShell腳本,該腳本還繪製了一個簡化某個任務的基本界面。 我需要一個特定的單擊事件綁定到一個按鈕元素,而我使用此代碼刪除按鈕上的點擊事件

$button_makeAction.add_Click({ 
    # my code 
}) 

的問題是,腳本執行過程中,我想該按鈕綁定到不同的單擊事件。使用相同的代碼附加另一個點擊事件並執行兩者,因此我需要類似$button_makeAction.reset_Click$button_makeAction.set_Click以刪除第一個事件代碼。這是正確的方法嗎?

回答

1

如何將IF語句添加到事件處理函數並根據條件執行代碼?

+0

這不是我的初衷,但它是一個解決方案,謝謝 – Naigel 2013-05-07 11:20:15

2

使用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_Clickremove_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}