我想在WPF <Rectangle>
上捕获鼠标并使用Caliburn Micro将其路由到命令实现。这是标记:
<Rectangle ... >
<Rectangle.InputBindings>
<MouseBinding Gesture="LeftClick" />
</Rectangle.InputBindings>
</Rectangle>
我需要将哪些Caliburn Micro语法添加到<MouseBinding>
元素,以便将点击路由到我的视图模型?
答案 0 :(得分:1)
您可以使用标准Button
控件,并更改控件模板以显示矩形:
<Button x:Name="Submit">
<Button.Template>
<ControlTemplate>
<Rectangle ... />
</ControlTemplate>
</Button.Template>
</Button>
答案 1 :(得分:0)
我写了一个小标记扩展,其行为与Caliburn.Micro动作非常相似。它在视图模型上调用方法。此示例仅支持没有参数的方法,但可以轻松扩展。
用法:
<Border.InputBindings>
<MouseBinding Command="{ns:CallViemodelMethod SomeMethod}" MouseAction="LeftClick" />
</Border.InputBindings>
查看型号:
public class SomeViewModel
{
publiv void SomeMethod()
{
// handle click
}
}
扩展:
public class CallViemodelMethod : MarkupExtension, ICommand
{
private readonly string _methodName;
private FrameworkElement _rootObject;
public CallViemodelMethod(string methodName)
{
_methodName = methodName;
}
public event EventHandler CanExecuteChanged;
public override object ProvideValue(IServiceProvider serviceProvider)
{
// get root of target page
var provideRoot = serviceProvider.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider;
_rootObject = provideRoot?.RootObject as FrameworkElement;
return this;
}
public bool CanExecute(object parameter) => true;
public void Execute(object parameter)
{
var dataContext = _rootObject?.DataContext;
if (dataContext == null) return;
var methodInfo = dataContext.GetType().GetMethod(_methodName);
if (methodInfo == null) return;
methodInfo.Invoke(dataContext, new object[0]);
}
}
答案 2 :(得分:0)
获取LeftClick可以做的一件事就是给矩形命名,并在视图的viewmodel中创建一个具有相同名称的方法: 这是caliburn micro的真正强大之处,它是配置的约定,即连接视图和视图模型,命令和响应等的命名约定......
xaml看起来像
<Rectangle x:Name="Rectangle" >
</Rectangle>
并且viewmodel看起来像
public void Rectangle()
{
// your code goes here
}