我是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。
我能实现吗?
提前致谢。
答案 0 :(得分:4)
是的,你可以这样做。你想要做的是使用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 :)。