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。
我能做到这一点吗?
提前致谢。
是的,你可以这样做。您想要做的是使用 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 :)。
| 归档时间: |
|
| 查看次数: |
1027 次 |
| 最近记录: |