从自定义控件的模板部分中删除事件处理程序
|
当我第一次开始编写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;
}
}
这种方法似乎可以解决问题。是否所有人都同意这是在自定义控件中挂接和删除事件处理程序的更好方法?如果没有,那为什么呢?
没有找到相关结果
已邀请:
2 个回复
傻零凰死授
目浆搽
方法注销在
中注册的事件。您可以重写该方法,因为它位于PresentationFramework dll的内部,但是您可以重写受保护的
方法以执行相同的操作-在Control基类中由
调用它。 以下示例代码可以放入您的自定义控件中:
我不确定这样做的所有含义,但它似乎是模拟WPF控件功能的最接近方法。