【发布时间】:2011-06-14 20:27:29
【问题描述】:
当我第一次开始编写 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;
}
}
这种方式似乎可以解决问题。每个人都同意这是在自定义控件中连接和删除事件处理程序的更好方法吗?如果不是,那为什么?
【问题讨论】:
标签: wpf custom-controls