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

McG*_*gle 5 .net c# silverlight mouseevent routed-events

的UIElement类定义的静态RoutedEvent成员MouseLeftButtonDownEventMouseLeftButtonUpEvent-但没有MouseMoveEvent.据我所知,框架层次结构中的任何类都没有.有常规事件定义:

public event MouseEventHandler MouseMove;
Run Code Online (Sandbox Code Playgroud)

所以你可以写:

void AttachHandler(UIElement element)
{
    element.MouseMove += OnMouseMove;
}
Run Code Online (Sandbox Code Playgroud)

但是你不能使用另一种形式,它允许你订阅甚至处理过的事件:

void AttachHandler(UIElement element)
{
    element.AddHandler(UIElement.MouseMoveEvent, new MouseEventHandler(OnMouseMove), true);
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是双重的:

  1. 为什么没有MouseMoveEvent定义任何地方?
  2. 是否有一种解决方法,允许您获取MouseMove事件的通知,即使它们被处理?

编辑

我看到MSDN文档承认这是一个限制:

此技术的局限性在于AddHandler API采用RoutedEvent类型的参数来标识所讨论的路由事件.并非所有Silverlight路由事件都提供RoutedEvent标识符,因此这种考虑会影响在Handled案例中仍可处理哪些路由事件.

编辑#2

根据@HansPassant,一般的答案是"MouseMove"事件不能被标记为"已处理",因此它们总是冒泡.除了明显的边缘情况之外,TextBox也是如此:当您单击TextBox的文本区域,从而激活拖动到选择的东西时,"MouseMove"事件不再被触发.我不知道为什么会这样.


注意 - 对于任何好奇的人 - 我正在尝试编写一个允许用户拖放TextBox的行为.TextBox控件默认拦截鼠标事件,以允许文本选择.

Han*_*ant 3

MSDN 文章中明确提到:

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

这回答了你的问题:

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

因为不需要。

是否有一种解决方法可以让您即使在处理 MouseMove 事件时也能收到通知?

你不需要它们,它们无法处理,因此总是冒泡。窗口的 MouseMove 事件处理程序将看到它们。