2013-05-07 230 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}