Калибурн Микро с WPF MouseBinding - PullRequest
1 голос
/ 23 ноября 2011

Я хотел бы захватить щелчок мыши на WPF <Rectangle> и направить его к реализации команды, используя Caliburn Micro. Вот разметка:

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

Какой синтаксис Caliburn Micro мне нужно добавить к элементу <MouseBinding>, чтобы я мог направить щелчок к моей модели представления?

Ответы [ 3 ]

1 голос
/ 23 ноября 2011

Вы можете использовать стандартный Button элемент управления и изменить шаблон элемента управления для отображения прямоугольника:

<Button x:Name="Submit">
    <Button.Template>
        <ControlTemplate>
            <Rectangle ... />
        </ControlTemplate>
    </Button.Template>
</Button>
0 голосов
/ 05 апреля 2017

Одна вещь, которую вы можете сделать, чтобы получить LeftClick, это просто дать имя прямоугольнику и создать метод с тем же именем в viewmodel представления: это реальная сила caliburn micro, которая является соглашением по конфигурации, т.е.соглашения об именах, связывающие представление и модель представления, команду и ответ и т. д. ...

xaml выглядит как

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

, а модель представления выглядит как

 public void Rectangle()
 { 
        // your code goes here
 }
0 голосов
/ 25 января 2017

Я написал небольшое расширение разметки, которое ведет себя очень похоже на действия 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]);
    }
}
...