Caliburn Micro Capture 鼠标位置

Ali*_*vik 2 .net wpf user-interface mvvm caliburn.micro

我是 Caliburn Micro 的新手,每当左键在 Viewport3D 控件上时,我都会尝试捕获鼠标位置。

在 XAML 中使用它;

cal:Message.Attach="[Event MouseLeftButtonUp] = [Action MouseUp($eventArgs, $source)]
Run Code Online (Sandbox Code Playgroud)

而在 ViewModel 中:

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

我可以获得鼠标点击位置。但是,我想在 ViewModel 中拥有的是这样的:

public void MouseUp(Point pt)
{
    // do something with pt
}
Run Code Online (Sandbox Code Playgroud)

我不想在我的 ViewModel 中有 IInputElement 参数等——事件是由 Viewport 引发的,所以它应该被视为 IInputElement。

我能做到这一点吗?

提前致谢。

Jas*_*son 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);
        });
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样在 Message.Attach 中使用它:

cal:Message.Attach="[Event MouseLeftButtonUp] = [Action MouseUp($mousepoint)]
Run Code Online (Sandbox Code Playgroud)

你去了,更干净的 ViewModel :)。