UIElement类定义了静态的RoutedEvent
成员MouseLeftButtonDownEvent
和MouseLeftButtonUpEvent
,但是没有MouseMoveEvent
。据我所知,在框架层次结构中也没有任何一个类定义这个事件。有一个常规的事件定义:
public event MouseEventHandler MouseMove;
因此,您可以编写:
void AttachHandler(UIElement element)
{
element.MouseMove += OnMouseMove;
}
但您不能使用另一种形式,该形式允许您订阅即使已处理的事件:
void AttachHandler(UIElement element)
{
element.AddHandler(UIElement.MouseMoveEvent, new MouseEventHandler(OnMouseMove), true);
}
我的问题有两个:
1. 为什么没有定义任何
MouseMoveEvent
?
2. 是否有一种解决方法,即使在处理事件时也能收到MouseMove事件的通知?编辑
我看到MSDN文档承认这是一种限制:
引用:
这种技术的局限性在于AddHandler API需要一个类型为RoutedEvent的参数来标识所讨论的路由事件。并非所有Silverlight路由事件都提供RoutedEvent标识符,因此这一考虑因素影响哪些路由事件仍然可以在Handled情况下处理。
编辑 #2根据@HansPassant的说法,通常的答案是“MouseMove”事件无法标记为“已处理”,因此它们总是冒泡的。除了一个明显的边缘情况之外,这对于TextBox是正确的:当您单击TextBox的文本区域时,从而激活拖动选择的东西,MouseMove事件不再被触发。我不知道为什么会这样。
注意-对于任何好奇的人-我正在尝试编写一个行为,允许用户拖放一个TextBox。 TextBox控件默认拦截鼠标事件,以允许文本选择。
UIElement.PreviewMouseMoveEvent
。 - Hamlet Hakobyan