可以处理WP7.1中的所有MouseMove事件吗?

时间:2012-04-15 17:07:15

标签: c# silverlight windows-phone-7 event-handling mouse

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

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

我的目标是将所有MouseMove事件放在ScrollViewer上,或者像ParentContainer一样合理地接近它,没有诉诸于设置ManipulationMode =&#34; Control&#34;在ScrollViewer上获得最佳性能。

当ManipulationMode =&#34; Control&#34;时,处理ParentContainer(或ScrollViewer)上的MouseMove。在ScrollViewer上设置,但在ManipulationMode =&#34; System&#34;时没有设置。这听起来像是为了提高Mango的性能,ScrollViewer开始吞咽MouseMove事件以提高性能。但是,我希望能够按如下方式处理这些处理事件:

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

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

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

我的最后一招可能是在ScrollViewer上添加一个叠加层,背景为&#34;透明&#34;这将捕获所有鼠标事件,但不将它们标记为已处理,并查看它们是否传播到ScrollViewer。

2 个答案:

答案 0 :(得分:4)

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

作为此更改的结果,除非将ManipulationMode设置为Control,否则您将无法从此控件捕获处理的鼠标事件。正如您在问题中所述,这将禁用为提高滚动性能而进行的更改。

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

以下是Microsoft关于此更改的博文:http://blogs.msdn.com/b/slmperf/archive/2011/06/02/listbox-scrollviewer-performance-improvement-for-mango-and-how-it-impacts-your-existing-application.aspx

答案 1 :(得分:3)

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

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