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)
这似乎只是删除了一个新实例,而不是前一个实例。
这里发生了什么?
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)