WPF Button MouseDown事件

Button的MouseDown事件 

WPF的Button控件,鼠标点击时,MouseDown事件没有触发。

经确认,Button的MouseDown被内部处理了。下面是基类ButtonBase的部分代码:

WPF Button MouseDown事件

Mouse的其它事件也是如此:

WPF Button MouseDown事件

官网的说明:

WPF Button MouseDown事件

所以,MouseDown、MouseUp、MouseLeftButtonDown、MouseLeftButtonUp、MouseMove、MouseEnter、MouseLeave,Button的这些冒泡事件是内部已经处理的。 

注:屏蔽Mouse事件的同时,按钮添加了Click事件和按压状态ButtonBase.IsPressed。

添加Button的MouseDowng事件

如何把Button的MouseDown事件添加回来?官网也给出了指导:

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

 

上一篇:用消息实现窗体的 MouseDown 事件


下一篇:input的失焦事件和click事件冲突问题