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 回答