是否可以收到任何MouseMove事件的通知,即使是那些标记为已处理的事件? 我有以下 Xaml:
<Grid x:Name="ParentContainer">
<ScrollViewer>
...
</ScrollViewer>
</Grid>
我的目标是在 ScrollViewer 上获取所有 MouseMove 事件,或者像 ParentContainer 这样相当接近它的东西,而无需在 ScrollViewer 上设置 ManipulationMode="Control" 以获得最佳性能。
在 ParentContainer(或 ScrollViewer)上处理 MouseMove 在 ScrollViewer 上设置 ManipulationMode="Control" 时有效,但在 ManipulationMode="System" 上则不然。 听起来像是为了提高Mango的性能,ScrollViewer开始吞噬MouseMove事件以提高性能。 但是,我希望能够按如下方式获取这些已处理的事件:
ParentContainer.AddHandler(???.MouseMoveEvent, MyMouseMoveHandler, true);
在 Silverlight 或 WPF 中,我希望代码将所有鼠标事件路由到 MyMouseMoveHandler,甚至是处理事件。 不幸的是,我找不到要传递给AddHandler的MouseMoveEvent的静态定义。
有没有人在WP7中成功地将AddHandler与MouseMoveEvent一起使用?
我最后的手段可能是在 ScrollViewer 顶部添加一个覆盖层,其中包含 Background="Transparent",它将捕获所有鼠标事件,但不将它们标记为已处理,并查看它们是否向下传播到 ScrollViewer。
在 Windows Phone OS 7.1 中,进行了专门改进 ScrollViewer 控件滚动的更改。 为此,他们必须将触摸手势的聆听移动到单独的线程中。这意味着控件侦听手势的方式的体系结构级别更改。在 Windows Phone 7.1 中,现在有 3 个线程负责滚动 ScrollViewer:一个用于输入,一个用于动画,一个用于创建新项目。
由于此更改,您将无法从此控件捕获已处理的鼠标事件,除非您将"操作模式"设置为"控件"。 正如您在问题中所述,这将禁用为提高滚动性能而进行的更改。
在这种情况下,您不能期望适用于非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
无需查找鼠标事件,而是可以使用 Touch.FrameReporting 事件在用户触摸屏幕时随时接收通知。 此事件报告滚动查看器,其中操作模式 == 系统。 这似乎是WP7上的全局MouseMove处理程序的合适解决方法。
http://msdn.microsoft.com/en-us/library/system.windows.input.touch.framereport(v=vs.95).aspx