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

时间:2014-05-21 18:35:13

标签: c# .net silverlight mouseevent routed-events

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事件的通知,即使它们已被处理?
  3. 修改

    我看到the MSDN docs acknowledge this as a limitation

      

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

    编辑#2

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


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

1 个答案:

答案 0 :(得分:3)

MSDN article中明确提到:

  

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

这样就回答了你的问题:

  

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

因为不需要。

  

是否有一种解决方法可以让您获得MouseMove事件的通知,即使它们已被处理?

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