1

是否可以获得任何 MouseMove 事件的通知,即使是那些标记为已处理的事件?我有以下 Xaml:

<Grid x:Name="ParentContainer">
  <ScrollViewer>
    ...
  </ScrollViewer>
</Grid>

我的目标是获取 ScrollViewer 上的所有 MouseMove 事件,或类似 ParentContainer 之类的合理接近的事件,而无需在 ScrollViewer 上设置 ManipulationMode="Control" 以获得最佳性能。

在 ScrollViewer 上设置 ManipulationMode="Control" 时,在 ParentContainer(或 ScrollViewer)上处理 MouseMove 有效,但在 ManipulationMode="System" 时无效。听起来像是在提高 Mango 的性能,ScrollViewer 开始吞下 MouseMove 事件以提高性能。但是,我希望能够获得这些已处理的事件,如下所示:

ParentContainer.AddHandler(???.MouseMoveEvent, MyMouseMoveHandler, true);

在 Silverlight 或 WPF 中,我希望该代码将所有鼠标事件路由到 MyMouseMoveHandler,甚至处理事件。不幸的是,我找不到要传递给 AddHandler 的 MouseMoveEvent 的静态定义。

有没有人在 WP7 中使用 AddHandler 和 MouseMoveEvent 成功?

我最后的手段可能是在 ScrollViewer 顶部添加一个具有 Background="Transparent" 的叠加层,它将捕获所有鼠标事件,但不将它们标记为已处理,并查看它们是否向下传播到 ScrollViewer。

4

2 回答 2

4

在 Windows Phone OS 7.1 中,进行了更改以专门改进 ScrollViewer 控件的滚动。为此,他们必须将触摸手势的侦听移至单独的线程。这意味着控件如何监听手势的架构级别发生了变化。在 Windows Phone 7.1 中,现在有 3 个线程负责滚动 ScrollViewer:一个用于输入,一个用于动画,一个用于创建新项目。

由于此更改,您将无法从此控件捕获已处理的鼠标事件,除非您将 ManipulationMode 设置为 Control。正如您在问题中所述,这将禁用为提高滚动性能所做的更改。

您不能期望适用于非 Windows Phone Silverlight 的解决方案会在这种情况下工作,因为从 Windows Phone 7.1 开始的手机上的底层架构根本不同。

这是微软关于这一变化的博客文章:http: //blogs.msdn.com/b/slmperf/archive/2011/06/02/listbox-scrollviewer-performance-improvement-for-mango-and-how-it-impacts -你的现有应用程序.aspx

于 2012-04-17T23:22:00.337 回答
3

在用户触摸屏幕时,可以使用 Touch.FrameReported 事件来接收通知,而不是寻找鼠标事件。此事件针对 ManipulationMode == System 的 ScrollViewer 报告。这似乎是 WP7 上全局 MouseMove 处理程序的合适解决方法。

http://msdn.microsoft.com/en-us/library/system.windows.input.touch.framereported(v=vs.95).aspx

于 2012-04-18T03:42:49.740 回答