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 を使用しています)