是否可以获得任何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。
答案 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