当我第一次开始编写WPF自定义控件时,如果我想添加事件处理程序,我会在获得模板部件后,在控件的OnApplyTemplate重写中执行此操作:
public void override OnApplyTemplate() {
if ( addMenu != null ) {
addMenu.Click -= addMenu_Click;
addMenu = null;
}
addMenu = (MenuItem)Template.FindName("PART_AddMenu", this);
addMenu.Click += addMenu_Click;
}
但是有一天,我注意到OnApplyTemplate()并不总是在我期望的时候调用,即当控件与可视化树断开连接时。也就是说,使用上面的技术,事件处理程序不会总是被删除。所以我想出了一种不同的方法:
public MyCustomControl()
{
Loaded += this_Loaded;
}
void this_Loaded(object sender, RoutedEventArgs e)
{
Unloaded += this_Unloaded;
addMenu = (MenuItem)Template.FindName("PART_AddMenu", this);
addMenu.Click += addMenu_Click;
}
void this_Unloaded(object sender, RoutedEventArgs e)
{
Unloaded -= this_Unloaded;
if (addMenu != null)
{
addMenu.Click -= addMenu_Click;
addMenu = null;
}
}
这种方式似乎起到了作用。是否每个人都认为这是在自定义控件中挂接和删除事件处理程序的更好方法?如果没有,那是为什么?
https://stackoverflow.com/questions/6349695
复制相似问题