Button的MouseDown事件
WPF的Button控件,鼠標點擊時,MouseDown事件沒有觸發。
經確認,Button的MouseDown被內部處理了。下面是基類ButtonBase的部分代碼:
Mouse的其它事件也是如此:
官網的說明:
所以,MouseDown、MouseUp、MouseLeftButtonDown、MouseLeftButtonUp、MouseMove、MouseEnter、MouseLeave,Button的這些冒泡事件是內部已經處理的。
注:屏蔽Mouse事件的同時,按鈕添加了Click事件和按壓狀態ButtonBase.IsPressed。
添加Button的MouseDowng事件
如何把Button的MouseDown事件添加回來?官網也給出了指導:
我用第二個方案AddHandler,這么處理的:
1 button.AddHandler(UIElement.MouseUpEvent, new MouseButtonEventHandler(Button_MouseUp), true); 2 button.AddHandler(UIElement.MouseDownEvent, new MouseButtonEventHandler(Button_MouseDown), true);
1 private void Button_MouseDown(object sender, MouseButtonEventArgs e) 2 { 3 4 } 5 private void Button_MouseUp(object sender, MouseButtonEventArgs e) 6 { 7 8 }
要用MouseButtonEventHandler,用MouseEventHandler會提示不匹配異常。對應的EventArgs則用MouseButtonEventArgs
至於原因,應該是,MouseDownEvent事件的注冊來源本來就是MouseButton。如下是UIElement鼠標路由對應的Mouse相關附加事件:
1 /// <summary> 2 /// 標識 <see cref="E:System.Windows.Input.Mouse.MouseDown" /> 附加事件。 3 /// </summary> 4 /// <returns> 5 /// <see cref="E:System.Windows.Input.Mouse.MouseDown" /> 附加事件的標識符。 6 /// </returns> 7 public static readonly RoutedEvent MouseDownEvent = EventManager.RegisterRoutedEvent("MouseDown", RoutingStrategy.Bubble, typeof (MouseButtonEventHandler), typeof (Mouse));