我在许多答案中都看到了这一点,我无法弄清楚它是如何运作的。
它通常采用这种方式(伪代码):
UIElement.AddHandler(routedEvent, new EventHandler(handler));
基本上似乎来创建委托的新实例并将其传递,以便将其添加到委托列表中。到目前为止,非常好。
但是,要删除它,你可以:
UIElement.RemoveHandler(routedEvent, new EventHandler(handler));
只有似乎才能删除新实例,而不是之前的实例。
这是怎么回事?
答案 0 :(得分:2)
如果您希望以后能够将其删除,则无法通过对您未提及任何引用的新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);
}
}
XAML:
<Button x:Name="btn" Content="Button" />