删除按钮上的单击事件

时间:2013-05-07 09:45:10

标签: events powershell

我正在使用一个PowerShell脚本,它还绘制了一个基本界面来简化某些任务。 我需要将特定的click事件绑定到button元素,我正在使用此代码

$button_makeAction.add_Click({
    # my code
})

问题是,在脚本执行期间,我想将该按钮绑定到另一个单击事件。使用相同的代码,它会附加另一个click事件并执行它们,因此我需要$button_makeAction.reset_Click$button_makeAction.set_Click之类的内容来删除第一个事件代码。这是正确的方法吗?

4 个答案:

答案 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}