【发布时间】:2014-07-10 13:39:39
【问题描述】:
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? - 是否有一种解决方法可以让您在处理 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