删除按钮上的点击事件
问题描述:
我正在使用一个PowerShell脚本,该脚本还绘制了一个简化某个任务的基本界面。 我需要一个特定的单击事件绑定到一个按钮元素,而我使用此代码删除按钮上的点击事件
$button_makeAction.add_Click({
# my code
})
的问题是,脚本执行过程中,我想该按钮绑定到不同的单击事件。使用相同的代码附加另一个点击事件并执行两者,因此我需要类似$button_makeAction.reset_Click
或$button_makeAction.set_Click
以删除第一个事件代码。这是正确的方法吗?
答
如何将IF语句添加到事件处理函数并根据条件执行代码?
答
使用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()
答
使用方法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]
甚至没有必要的。但也要记住这个诀窍。
答
你可以这样做:
$Button.Add_Click({If ($Button.Tag) {Invoke-Command $Button.Tag}})
在像标签属性然后设置您的动态事件:
$Button.Tag = {MyCode}
这不是我的初衷,但它是一个解决方案,谢谢 – Naigel 2013-05-07 11:20:15