protected const string PART_ViewButton = nameof(PART_ViewButton); private Button btnView = null; public Button ViewButton { get { return btnView; } set { // 先反注册事件 if (btnView != null) { btnView.Click -= BtnView_Click; } btnView = value; if (btnView != null) { btnView.Click += BtnView_Click; } } } public override void OnApplyTemplate() { base.OnApplyTemplate(); ViewButton = GetTemplateChild(PART_ViewButton) as Button; } private void BtnView_Click(object sender, RoutedEventArgs e) { // 这里写响应逻辑 }
针对最终的代码,这里再提几点:
1. 在 OnApplyTemplate 方法中,建议一开始要先调用 base.OnApplyTemplate();
2. 无论在为控件反注册事件,还是注册事件时,都要对控件是否为空进行判断,这是因为有可能用户重写模板时没有遵循 TemplatePart 属性中所指定的控件名称;
3. 将控件的名称声明为常量,可以避免字符串拼写错误;
总结
本文讨论了在 WPF 或 UWP 中创建自定义控件时,可能会遇到内存泄露的问题;这主要是由于模板中的控件事件没有反注册导致的。我们不仅分析了其中的原因,也给出了针对这种情况的最佳实践。
虽然在一般情况下,这一问题并不会造成较大的影响,但是,如果我们能够在这些细节上注意,这样不仅能够提高我们的代码质量与程序的性能,也能够给我们在设计或处理类似的问题时,提供必要的思路与经验。
以上这篇XAML: 自定义控件中事件处理的最佳实践方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。