2

私は Caliburn Micro を初めて使用し、Viewport3D コントロールで左ボタンが押されたときにマウスの位置をキャプチャしようとしています。

これを XAML で使用します。

cal:Message.Attach="[Event MouseLeftButtonUp] = [Action MouseUp($eventArgs, $source)]

そしてViewModelのそれ:

public void MouseUp(MouseEventArgs args, IInputElement elem)
{
    Point pt = args.GetPosition(elem);
    //do something with pt
}

マウスのヒット位置を取得できます。ただし、ViewModel に入れたいのは次のようなものです。

public void MouseUp(Point pt)
{
    // do something with pt
}

ViewModel に IInputElement パラメータなどを含めたくありません。イベントは Viewport によって発生するため、IInputElement と見なす必要があります。

これを達成できますか?

前もって感謝します。

4

1 に答える 1

5

はい、できます。あなたがしたいことは、 MessageBinder.SpecialValues を使用して、ポイントを解析し、代わりにそれを返す独自の特別な値を作成することです。

したがって、Caliburn.Micro をセットアップする場所に、次のコードを追加します。

        MessageBinder.SpecialValues.Add("$mousepoint", ctx =>
        {
            var e = ctx.EventArgs as MouseEventArgs;
            if (e == null)
                return null;

            return e.GetPosition(ctx.Source);
        });

次に、次のように Message.Attach で使用できます。

cal:Message.Attach="[Event MouseLeftButtonUp] = [Action MouseUp($mousepoint)]

ほら、きれいなViewModel:)。

于 2012-12-06T22:26:56.067 に答える