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);
}
所以我的问题有两个:
MouseMoveEvent
?修改
我看到the MSDN docs acknowledge this as a limitation:
此技术的局限性在于AddHandler API采用RoutedEvent类型的参数来标识所讨论的路由事件。并非所有Silverlight路由事件都提供RoutedEvent标识符,因此这种考虑会影响在Handled案例中仍可处理哪些路由事件。
编辑#2
Per @HansPassant,一般的答案是“MouseMove”事件不能被标记为“已处理”,因此它们总是冒泡。除了明显的边缘情况之外,TextBox也是如此:当您单击TextBox的文本区域,从而激活拖动到选择的东西时,“MouseMove”事件不再被触发。我不知道为什么会这样。
注意 - 对于任何好奇的人 - 我正在尝试编写允许用户拖放TextBox的行为。 TextBox控件默认拦截鼠标事件,以便允许文本选择。
答案 0 :(得分:3)
MSDN article中明确提到:
MouseMove不能与AddHandler一起使用,因为其事件数据中没有Handled
这样就回答了你的问题:
为什么没有在任何地方定义MouseMoveEvent?
因为不需要。
是否有一种解决方法可以让您获得MouseMove事件的通知,即使它们已被处理?
你不需要一个,它们无法处理,因此总是冒泡。 Window的MouseMove事件处理程序将看到它们。