zoukankan      html  css  js  c++  java
  • 【C#】AddHandler可重复多次添加事件处理器的问题

    问题:在项目中发现,可以重复多次添加同一个Handler,导致触发时执行多次的问题。

    这个现象也很好测试:

    前台准备一个Label文本

    <Label x:Name="label" Content="测试重复多次AddHandler点击事件" Width="300" Height="200"
               HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>

    后台给它重复多次添加同一个事件处理器Handler。这里选用鼠标左键弹起事件方便测试。

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
    
            CheckAddHandler();
        }
    
        // 测试重复多次添加同一个Handler
        private void CheckAddHandler()
        {
            label.AddHandler(Label.MouseLeftButtonUpEvent, new RoutedEventHandler(Label_MouseLeftButtonUpEvent));
            label.AddHandler(Label.MouseLeftButtonUpEvent, new RoutedEventHandler(Label_MouseLeftButtonUpEvent));
            label.AddHandler(Label.MouseLeftButtonUpEvent, new RoutedEventHandler(Label_MouseLeftButtonUpEvent));
            label.AddHandler(Label.MouseLeftButtonUpEvent, new RoutedEventHandler(Label_MouseLeftButtonUpEvent));
            label.AddHandler(Label.MouseLeftButtonUpEvent, new RoutedEventHandler(Label_MouseLeftButtonUpEvent));
            label.AddHandler(Label.MouseLeftButtonUpEvent, new RoutedEventHandler(Label_MouseLeftButtonUpEvent));
        }
    
        // 鼠标左键弹起事件
        private void Label_MouseLeftButtonUpEvent(object sender, RoutedEventArgs e)
        {
            System.Console.WriteLine("添加事件");
        }
    }

    运行后,看输出可知,该Handler可以重复执行多次。
    这里写图片描述


    结论:如果要添加Handler,但又不想重复添加,可以在添加之前先调用清理该Handler,然后再添加。从而保证只添加一次。

    // 先移出
    label.RemoveHandler(Label.MouseLeftButtonUpEvent, new RoutedEventHandler(Label_MouseLeftButtonUpEvent));
    // 再添加
    label.AddHandler(Label.MouseLeftButtonUpEvent, new RoutedEventHandler(Label_MouseLeftButtonUpEvent));
  • 相关阅读:
    linux进程管理相关命令
    win7 64位系统使用vs2010编译OSG3.2.1
    Linux入门
    Implement strStr()
    Remove Element
    Remove Duplicates from Sorted Array
    Reverse Nodes in k-Group
    node npm vue.js 笔记
    NodeJS、NPM安装配置与测试步骤(windows版本)
    Python HTTP库requests中文页面乱码解决方案!
  • 原文地址:https://www.cnblogs.com/guxin/p/csharp-wpf-add-multi-handler.html
Copyright © 2011-2022 走看看