原因:由于某些控件内部有一些内建的事件处理,其MouseDown事件(包括MouseUp等)在处理完成之后将Handled标志置为true,附加事件PreviewMouseDown事件也就不再被执行,所以普通的MouseDown事件代码是不会有作用的。如果要使用MouseDown事件,要么使用PreviewMouseDown事件来替代,要么使用AddHandler来添加自定义的路由事件处理。
解决:使用AddHandler添加自定义的路由事件,可添加多次,重复执行多次
// 测试重复多次添加同一个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));
}
如果要添加Handler,但又不想重复添加,可以在添加之前先调用清理该Handler,然后再添加。
// 先移除
label.RemoveHandler(Label.MouseLeftButtonUpEvent, new RoutedEventHandler(Label_MouseLeftButtonUpEvent));
// 再添加
label.AddHandler(Label.MouseLeftButtonUpEvent, new RoutedEventHandler(Label_MouseLeftButtonUpEvent));