1. 程式人生 > >【C#】AddHandler可重複多次新增事件處理器的問題

【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));