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 に答える