WPF RemoveHandler与新的处理程序

WPF RemoveHandler与新的处理程序,wpf,event-handling,Wpf,Event Handling,我在很多答案中都看到了这一点,但我不知道它是如何工作的 它通常是这样的(伪代码): 它基本上似乎创建了一个委托的新实例并传递它,以便将其添加到委托列表中。到目前为止,一切顺利 但是,要删除它,您需要: UIElement.RemoveHandler(routedEvent, new EventHandler(handler)); 这似乎只是删除了一个新实例,而不是前一个实例 这里发生了什么?如果您希望以后能够删除新的EventHandler的引用,则不能将该引用传递给不保留任何引用的新的Eve

我在很多答案中都看到了这一点,但我不知道它是如何工作的

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

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

但是,要删除它,您需要:

UIElement.RemoveHandler(routedEvent, new EventHandler(handler));
这似乎只是删除了一个新实例,而不是前一个实例


这里发生了什么?

如果您希望以后能够删除新的
EventHandler
的引用,则不能将该引用传递给不保留任何引用的新的
EventHandler

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

这是有效的,即当单击
按钮时,事件处理程序仅被调用一次:

代码:

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);
    }
}
XAML:

<Button x:Name="btn" Content="Button" />

<Button x:Name="btn" Content="Button" />