2

TranslateTransform にデータ バインドされた 2 つの double (TranslateX、TranslateY) に基づいて TranslateTransform が適用されるカスタム WPF コントロールを作成しようとしています。これは、ボタンまたはスクロールバーを使用して 2 つの double を操作する場合に完全に機能しますが、ユーザーがカスタム コントロール内をドラッグして、その中のコントロールを変換できるようにします。

これを行うために、PreviewMouseDown、Up、および Move ハンドラーをカスタム コントロール内に追加しました。(私が理解しているように、「プレビュー」イベントは常に受信する必要があります。これは、バブルアップするのではなく、下から下にトンネリングするためです)。

//Inside the constructor of the custom control
Mouse.AddPreviewMouseDownHandler(this, new MouseButtonEventHandler(MouseDown));
Mouse.AddPreviewMouseUpHandler(this, new MouseButtonEventHandler(MouseUp));
Mouse.AddPreviewMouseMoveHandler(this, new MouseEventHandler(MouseMoved));

イベントは、次のメソッドによって処理されます。

        private void OnMouseDown(object o, MouseEventArgs args)
        {
            Mouse.Capture(this, CaptureMode.Element);
            prevMousePosition = args.GetPosition(this);
        }

        private void OnMouseUp(object o, MouseEventArgs args)
        {
            Mouse.Capture(this, CaptureMode.None);
        }

        private void OnMouseMoved(object o, MouseEventArgs args)
        {
            if (args.LeftButton == MouseButtonState.Pressed)
            {
                Vector change = prevMousePosition - args.GetPosition(this);

                TranslateX += change.X;
                TranslateY += change.Y;

                prevMousePosition = args.GetPosition(this);
            }             
        }

ただし、OnMouseMoved メソッドは、マウスを必死に動かしたときにのみ呼び出され、ゆっくりと動かした場合には呼び出されません (ほとんどの人がドラッグ時に行うことになります)。また、(当然のことながら) カスタム コントロールの外に出ると、イベントの発生が完全に停止しますが、ユーザーはマウスの位置を変更せずにさらにドラッグし続けたい場合があります。

だから私の質問は、マウスの位置と移動イベントをキャプチャして、ユーザーがカスタムコントロール内でスムーズにドラッグでき、ドラッグによってマウスがカスタムコントロールの外に出たとしてもドラッグを続けることができるようにするにはどうすればよいですか?

(小さなメモ: 私はまだ .NET 3.5 を使用しています)

4

1 に答える 1

1

「WPFでドラッグするようなGoogleマップ」を検索した後、スクロールとズームが可能な仮想化されたWPFキャンバスを提供することで私の質問に完全に答えた別のSOの質問を見つけました。

今のところ、リンクを共有します: http://blogs.msdn.com/b/jgoldb/archive/2008/03/08/performant-virtualized-wpf-canvas.aspx

仮想化された WPF キャンバス

既にご存知かもしれませんが、WPF には VirtualizingStackPanel と呼ばれる組み込みの仮想化パネルがあり、UI の仮想化をサポートし、StackPanel のような要素をレイアウトします。

WPF ListBox & ListView コントロールは、デフォルトでこのパネルを使用します。Canvas などの他のコンテナ コントロールは、.Net 3.0 & 3.5 で仮想化をサポートしていません。

Microsoft の Chris Lovett は、大量のメモリを消費することなく何千もの WPF 要素を効率的にホストおよびスクロールできるように、Canvas コンテナー コントロールを仮想化する方法を示す優れたサンプルを作成しました。

提供されているダウンロード可能な ZIP には、ホワイト ペーパーとコードが含まれています。

VirtualCanvas.zip

(申し訳ありませんが、もっとよく検索する必要がありましたが、この機能を持つ同様のソフトウェアの検索用語を追加することは考えていませんでした)。

于 2011-07-13T09:29:23.810 に答える