当我开始编写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;
}
}
这种方式似乎很有效。大家是否都认同这是自定义控件中连接和删除事件处理程序的更好方法?如果不是,那么为什么呢?