【问题标题】:Why is there no MouseMoveEvent -- or, how to use AddHandler for the mouse move event为什么没有 MouseMoveEvent - 或者,如何使用 AddHandler 进行鼠标移动事件
【发布时间】:2014-07-10 13:39:39
【问题描述】:

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 事件时收到通知?

编辑

我看到the MSDN docs acknowledge this as a limitation

此技术的一个限制是 AddHandler API 采用 RoutedEvent 类型的参数,该参数标识有问题的路由事件。并非所有 Silverlight 路由事件都提供 RoutedEvent 标识符,因此这种考虑会影响在 Handled 情况下仍可以处理哪些路由事件。

编辑#2

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


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

【问题讨论】:

  • 你可以使用UIElement.PreviewMouseMoveEvent
  • @HamletHakobyan 好吧,在 Silverlight 中也不存在。我想这只是 Silverlight 所没有的功能之一。我仍然很想知道最好的解决方法是什么,如果有的话。
  • MSDN article中明确提到:“MouseMove不能与AddHandler一起使用,因为它的事件数据中没有Handled”

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


【解决方案1】:

MSDN article中明确提到:

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

这样就回答了你的问题:

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

因为不需要。

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

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

【讨论】:

  • 啊,谢谢,我错过了。 “他们总是冒泡”是真的,除非文本选择拖动是活动的。也就是说,当鼠标左键按下时,我没有让 MouseMove 事件冒泡。一个边缘案例显然......我不清楚为什么会发生这种情况,或者它是否是一个错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 2016-09-05
  • 2012-01-14
  • 1970-01-01
相关资源
最近更新 更多