我正在使用一个PowerShell脚本,它还绘制了一个基本界面来简化某些任务。 我需要将特定的click事件绑定到button元素,我正在使用此代码
$button_makeAction.add_Click({
# my code
})
问题是,在脚本执行期间,我想将该按钮绑定到另一个单击事件。使用相同的代码,它会附加另一个click事件并执行它们,因此我需要$button_makeAction.reset_Click
或$button_makeAction.set_Click
之类的内容来删除第一个事件代码。这是正确的方法吗?
答案 0 :(得分: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()
答案 1 :(得分: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]
。但是也记住这个伎俩。
答案 2 :(得分:1)
如何将IF语句添加到事件处理程序并根据条件执行代码?
答案 3 :(得分:1)
您可以执行以下操作:
$Button.Add_Click({If ($Button.Tag) {Invoke-Command $Button.Tag}})
然后在标记属性中设置动态事件,如:
$Button.Tag = {MyCode}