使用新处理程序的 WPF RemoveHandler

mot*_*zzt 6 wpf event-handling

我在很多答案中都看到过这个,但我不知道它是如何工作的。

通常是这样的(伪代码):

UIElement.AddHandler(routedEvent, new EventHandler(handler));
Run Code Online (Sandbox Code Playgroud)

这基本上似乎创建了委托的新实例并传递它,以便将其添加到委托列表中。到目前为止,一切都很好。

但是,要删除它,您需要执行以下操作:

UIElement.RemoveHandler(routedEvent, new EventHandler(handler));
Run Code Online (Sandbox Code Playgroud)

似乎只是删除了一个新实例,而不是前一个实例。

这里发生了什么?

mm8*_*mm8 6

EventHandler如果您希望稍后能够将其删除,则无法将引用传递给未保留任何引用的新对象。

将处理程序强制转换为适当的委托类型。

这是可行的,即事件处理程序仅在单击时调用一次Button

代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        btn.AddHandler(Button.ClickEvent, (RoutedEventHandler)OnClick);
    }

    private void OnClick(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("click");
        btn.RemoveHandler(Button.ClickEvent, (RoutedEventHandler)OnClick);
    }
}
Run Code Online (Sandbox Code Playgroud)

XAML:

<Button x:Name="btn" Content="Button" />
Run Code Online (Sandbox Code Playgroud)