2

我正在使用一个 powershell 脚本,该脚本还绘制了一个基本界面来简化某些任务。我需要将特定的单击事件绑定到按钮元素,并且我正在使用此代码

$button_makeAction.add_Click({
    # my code
})

问题是,在脚本执行期间,我想将该按钮绑定到不同的单击事件。使用相同的代码,它会附加另一个点击事件并执行两者,所以我需要类似$button_makeAction.reset_Clickor$button_makeAction.set_Click的东西来删除第一个事件代码。这是正确的方法吗?

4

4 回答 4

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()
于 2013-05-07T12:12:30.343 回答
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]甚至不需要转换为。但也要记住这个技巧。

于 2013-05-08T04:04:38.107 回答
1

您可能会执行以下操作:

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

然后在标签属性中设置您的动态事件,例如:

$Button.Tag = {MyCode}
于 2014-05-20T12:01:37.753 回答
1

如何将 IF 语句添加到事件处理程序并根据条件执行代码?

于 2013-05-07T10:28:33.320 回答