为什么没有MouseMoveEvent - 或者说,如何使用AddHandler处理鼠标移动事件

5

UIElement类定义了静态的RoutedEvent成员MouseLeftButtonDownEventMouseLeftButtonUpEvent,但是没有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控件默认拦截鼠标事件,以允许文本选择。

1
您可以使用 UIElement.PreviewMouseMoveEvent - Hamlet Hakobyan
@HamletHakobyan 嗯,Silverlight中也不存在这个功能。我猜这只是Silverlight没有的那些功能之一。如果有的话,我还是很想知道最好的解决方法是什么。 - McGarnagle
1
MSDN文章中明确提到:“MouseMove不能与AddHandler一起使用,因为其事件数据中没有Handled”。 - Hans Passant
1个回答

3
MSDN文章中明确提到:

MouseMove不能与AddHandler一起使用,因为其事件数据中没有Handled属性

这就回答了你的问题:

为什么没有在任何地方定义MouseMoveEvent?

因为不需要。

是否有一种解决方法可以在处理后获得MouseMove事件的通知?

你不需要这样做,它们无法被处理,因此始终会冒泡。窗口的MouseMove事件处理程序将看到它们。


啊,谢谢,我错过了那个。 "它们总是冒泡"是正确的,除非文本选择拖动功能处于活动状态。也就是说,在按下左键时,我不会收到MouseMove事件冒泡。这显然是一个边缘情况...我不清楚为什么会发生这种情况,或者是否是一个错误。 - McGarnagle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接