1

我想捕获 WPF 上的鼠标单击<Rectangle>并将其路由到使用 Caliburn Micro 的命令实现。这是标记:

<Rectangle ... >
    <Rectangle.InputBindings>
        <MouseBinding Gesture="LeftClick" />
    </Rectangle.InputBindings>
</Rectangle>

我需要向<MouseBinding>元素添加什么 Caliburn Micro 语法才能将点击路由到我的视图模型?

4

3 回答 3

2

您可以使用标准Button控件,并更改控件模板以显示矩形:

<Button x:Name="Submit">
    <Button.Template>
        <ControlTemplate>
            <Rectangle ... />
        </ControlTemplate>
    </Button.Template>
</Button>
于 2011-11-22T20:29:14.440 回答
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]);
    }
}
于 2017-01-25T14:17:33.013 回答
0

要获得 LeftClick,您可以做的一件事就是为矩形命名并在视图的视图模型中创建一个具有相同名称的方法:这是 caliburn micro 的真正强大之处,它是配置上的约定,即命名约定连接view 和 viewmodel ,命令和响应等等......

xml看起来像

<Rectangle x:Name="Rectangle" >
</Rectangle>

并且视图模型看起来像

 public void Rectangle()
 { 
        // your code goes here
 }
于 2017-04-05T09:36:00.570 回答