1

処理済みとしてマークされているイベントであっても、MouseMoveイベントの通知を受け取ることはできますか?私は次のXamlを持っています:

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

私の目標は、最高のパフォーマンスを得るためにScrollViewerでManipulationMode = "Control"を設定することなく、ScrollViewerまたはParentContainerのようなそれにかなり近いものですべてのMouseMoveイベントを取得することです。

ParentContainer(またはScrollViewer)でのMouseMoveの処理は、ManipulationMode = "Control"がScrollViewerに設定されている場合は機能しますが、ManipulationMode="System"の場合は機能しません。Mangoのパフォーマンスを改善するように思えますが、ScrollViewerはパフォーマンスを改善するためにMouseMoveイベントを飲み込み始めました。ただし、これらの処理されたイベントを次のように取得できると期待しています。

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

SilverlightまたはWPFでは、コードがすべてのマウスイベントをMyMouseMoveHandlerにルーティングし、イベントを処理することも期待します。残念ながら、AddHandlerに渡すMouseMoveEventの静的定義が見つかりません。

WP7でMouseMoveEventでAddHandlerを使用して成功した人はいますか?

私の最後の手段は、すべてのマウスイベントをキャプチャするBackground = "Transparent"を使用してScrollViewerの上にオーバーレイを追加することですが、それらを処理済みとしてマークせず、それらがScrollViewerに伝播するかどうかを確認します。

4

2 に答える 2

4

Windows Phone OS 7.1では、ScrollViewerコントロールのスクロールを特に改善するために変更が加えられました。これを行うには、タッチジェスチャのリスニングを別のスレッドに移動する必要がありました。これは、コントロールがジェスチャをリッスンする方法のアーキテクチャレベルの変更を意味しました。Windows Phone 7.1では、ScrollViewerのスクロールを担当する3つのスレッドがあります。1つは入力用、1つはアニメーション用、もう1つは新しいアイテムの作成用です。

この変更の結果、ManipulationModeをControlに設定しない限り、このコントロールから処理されたマウスイベントをキャプチャすることはできません。ただし、質問で述べたように、これにより、スクロールのパフォーマンスを向上させるために行われた変更が無効になります。

Windows Phone 7.1以降の電話では、基盤となるアーキテクチャが根本的に異なるため、この場合、WindowsPhone以外のSilverlightで機能するソリューションが機能することは期待できません。

変更に関する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

于 2012-04-17T23:22:00.337 に答える
3

マウス イベントを探す代わりに、Touch.FrameReported イベントを使用して、ユーザーが画面に触れるたびに通知を受け取ることができます。このイベントは、ManipulationMode == System である ScrollViewers について報告します。これは、WP7 のグローバル MouseMove ハンドラーの適切な回避策のようです。

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

于 2012-04-18T03:42:49.740 に答える