CanvasとCanvas上のボタンを含むユーザーコントロールを作成しました。ボタンをキャンバス上で移動できるようにするために、以下に示すDragBehaviorをアタッチしました。
class DragOverCanvasBehavior : Behavior<FrameworkElement>
{
private Point _mouseStartPosition;
protected override void OnAttached()
{
AssociatedObject.MouseLeftButtonDown += (sender, e) =>
{
_mouseStartPosition = e.GetPosition((Canvas) AssociatedObject.Parent);
AssociatedObject.CaptureMouse();
};
AssociatedObject.MouseLeftButtonUp += (sender, e) => AssociatedObject.ReleaseMouseCapture();
AssociatedObject.MouseMove += (sender, e) =>
{
var point = e.GetPosition((Canvas)AssociatedObject.Parent) - _mouseStartPosition;
if (AssociatedObject.IsMouseCaptured)
{
Canvas.SetTop(AssociatedObject, point.Y);
Canvas.SetLeft(AssociatedObject, point.X);
}
};
}
}
ビジネス上の理由から、キャンバスを押したままドラッグする場合も、キャンバスを移動する必要があります。同様のBehaviorクラスを使用して、Canvasの余白を変更し、ドラッグ時にマウスポインタと一緒に移動しているように見せました。この動作はマウスもキャプチャします。
ここで問題は-ボタンをクリックしてドラッグすると、CanvasもMouseイベントを取得し、ドラッグを開始します。ボタンをドラッグしているときに、キャンバスの動作でマウスイベントが発生しないようにするにはどうすればよいですか。
Behaviorsにe.Handled=trueを入れてみましたが、うまくいきませんでした。
マウスが他のオブジェクトによってすでにキャプチャされていることがわかった場合は、Behaviorに条件を設定して、再度キャプチャしないようにすることができます。