【C#】AddHandler可重複多次新增事件處理器的問題
阿新 • • 發佈:2019-02-12
問題:在專案中發現,可以重複多次新增同一個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));