2012-04-15 59 views
1

是否有可能获得任何MouseMove事件的通知,即使是标记为已处理的事件?我有下面的XAML代码:可以处理WP7.1中的所有MouseMove事件吗?

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

我的目标是让在ScrollViewer中所有的MouseMove事件,或在ScrollViewer中的东西相当接近它像ParentContainer,没有诉诸设置ManipulationMode =“控制”最好的表现。

当在ScrollViewer上设置ManipulationMode =“Control”时,在ParentContainer(或ScrollViewer)上处理MouseMove,但在ManipulationMode =“System”时不能处理。这听起来像是为了提高Mango的性能,ScrollViewer开始吞噬MouseMove事件以提高性能。不过,我希望能够得到这些处理的事件如下:

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

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

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

我最后的手段可能是在背景=“透明”的ScrollViewer的顶部添加一个叠加层,它可以捕获所有Mouse事件,但不会将它们标记为已处理,并查看它们是否传播到ScrollViewer。

回答

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-your-existing-application.aspx

+0

感谢您的彻底解答布赖恩。你是对的,AddHandler()是一种非Silverlight方法,我希望找到一种解决方法(请参阅下面的答案)。 – 2012-04-18 03:40:20

相关问题