9

PDFドキュメントでパンするのと同じ方法でScrollViewerのコンテンツをパンしようとしています(スクロールしてズームイン/ズームアウトし、クリックしてドラッグしてパンします)ScrollViewerには、タッチイベント用にこの機能が組み込まれています(PanningMode)ただし、これはClick+Dragイベントに変換されないようです。この機能をエミュレートするように指示する方法はありますか?

4

1 に答える 1

2

パンニングは、ScrollViewer によって実装される 4 つの仮想メソッドによって内部的に有効になります。

OnManipulationCompleted
OnManipulationDelta
OnManipulationInertiaStarting
and OnManipulationStarting

これらの仮想メソッドはどこで定義されていますか。階層を上ってみましょう。OnManipulationCompletedThunk 内の UIElement で呼び出されていることがわかります (残りの部分にも付随するメソッドがあると確信しています)。

この時点ではまだすべてが非公開です。何かを活用したいと考えています。残念ながら、これはリフレクターと ILSpy の両方が失敗したポイントです (実際にはそうではありませんでした。呼び出しサイトは、brb をロードしていない別の dll (PresentationCore) にあります)。わかりました。PresentationCore を調べると、dependencyProperties が静的に登録されているという漠然とした考えがあるため、.cctor を見つけます。ここには興味深い行がいくつかあります。

ManipulationCompletedEvent = Manipulation.ManipulationCompletedEvent.AddOwner(typeof(UIElement));

EventManager.RegisterClassHandler(typeof(UIElement), ManipulationCompletedEvent, new EventHandler(UIElement.OnManipulationCompletedThunk));

OnManipulationCompletedThunk が、ManipulationCompletedEvent をリッスンするこのクラス ハンドラーの登録済みコールバックであることがわかります。また、ManipulationCompletedEvent は元々 UIElement で定義されたものではなく、AddOwner を介して Manipulation 静的クラスから借用されます。

Manipulation クラスを検索すると、同じアセンブリ内の System.Windows.Input 名前空間にあることがわかります。公開ですか、はい。涼しい!したがって、この時点で、ManipulationCompletedEvent またはその仲間のいずれかを起動すると、最終的に ScrollViewer が呼び出されることがわかります。http://msdn.microsoft.com/en-us/library/system.windows.input.manipulation.aspx

この public static クラスのドキュメントには、興味深い、おそらく役立つメソッドがたくさんあることがわかります。すぐにはわからないのは AddManipulator だけです。これは何をしますか?クリック..読み取り..ああ、「各タッチ ポイントは IManipulator オブジェクトです。たとえば、2 本の指を使用してオブジェクトのサイズを変更する場合、IManipulator を実装する TouchDevice が各指に対して作成されます。」TouchDevice は IManipulator です。多分それは私自身のマニピュレータを作成する方法のアイデアを私に与えるでしょう.

TouchDevice のプロパティは、サポートされている機能に関する手がかりを提供します。MouseDevice (キャプチャ、DirectlyOver などの概念があります) のようなものですが、同じ方法での操作はサポートされていません。むしろ、マウス イベントに応答してマニピュレーションを実行したいと考えています。TouchDevice を詳しく見て、これらの機能のいくつかを実際にどのように実装しているかを見てみましょう。

TouchDevice が実装しているメソッドは、GetPosition と ManipultionEnded です。

GetPosition は this.GetTouchPoint(relativeTo).Position を返します。relativeTo はパラメーターです

ManipulationEnded は OnManipulationEnded を呼び出し、cancel という名前の bool パラメーターを転送します。キャンセルが何をするのかまだわかりません。ああ、それは使用されていないことがわかりました。奇妙ですが、大丈夫です。これは基本的にキャプチャを null に設定します。ここのうさぎの穴の終わりのようなものなので、バックアップして再評価する必要があります.

私が実際にやりたいことは、UIElement で手動でイベントを発生させ、それが機能するかどうかを確認することだけです。これには、UIElement の RaiseEvent メソッドが機能するはずです。brbを試してみます。Manipulation クラスで定義されたすべてのイベントが内部としてマークされています。

明らかに、これらのイベントは内部消費のみを目的としており、熟考を行わない限り、そこに道はありません。

おそらく、操作機能を使用することは、あなたがやろうとしていることに対してやり過ぎだと思います. ドラッグ イベントとキャンバスだけでこれを実装する方法がおそらくあるでしょう。

また、グーグルでこれを見つけて、関連性があるかもしれないと考えましたhttp://multitouchvista.codeplex.com/

于 2012-11-21T06:23:44.047 に答える