Как назначить сочетания клавиш от пользователя во время выполнения, WPF MVVM - PullRequest
0 голосов
/ 17 декабря 2018

Как видно из заголовка, я ищу способ назначения сочетаний клавиш от пользователя во время выполнения, используя шаблон WPF MVVM.Я знаю, что я могу определить сочетания клавиш при запуске следующим образом:

<Window.InputBindings>
    <KeyBinding Command="{Binding MyCommand}" Key="A"/>
</Window.InputBindings>

Я также видел, что есть способ анализировать привязки ввода от пользователя .Однако я борюсь с тем, чтобы связать inputbinding из моей ViewModel с InputBinding MainWindow.Я не знаю, как этого добиться.Вот код в моем MainWindow:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new MainWindowViewModel();
    }
}

А вот пример кода из моей ViewModel:

public partial class MainWindowViewModel : Window, INotifyPropertyChanged
{
    public MainWindowViewModel()
    {
        KeyBinding kb = new KeyBinding { Key = Key.T, Command = MyCommand };
        this.InputBindings.Add(kb);
    }
}

Я знаю, что часть this.InputBindings.Add(kb);, вероятно, должна быть заменена чем-то другим;вместо этого добавляем связывание клавиш в InputBinding MainWindow.Тем не менее, я не знаю, как это сделать с шаблоном MVVM.Поэтому: как бы я поступил так?

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Если они должны быть сохранены, чтобы они работали в следующий раз, когда пользователь запустит приложение, вы можете создать словарь ресурсов в виде строки или некомпилированного плоского файла.

Это позволит вам работать с xaml какстроки.Вы можете записать это на диск и xamlreader.load в словарь ресурсов, а затем объединить его с ресурсами приложения.

https://social.technet.microsoft.com/wiki/contents/articles/28797.wpf-dynamic-xaml.aspx

Этот подход предлагает несколько преимуществ:

Стильлегко сохраняется.Вы можете попробовать и посмотреть, что происходит.Вы можете записать файл на диск, используя метод модели, вызываемый из вашей модели представления.

0 голосов
/ 17 декабря 2018

Вы можете определить входные привязки в модели представления, но вам все равно нужно как-то добавить их в представление.

Например, вы можете использовать прикрепленное поведение, которое делает это за вас:

public class InputBindingsBehavior
{
    public static readonly DependencyProperty InputBindingsProperty = DependencyProperty.RegisterAttached(
        "InputBindings", typeof(IEnumerable<InputBinding>), typeof(InputBindingsBehavior), new PropertyMetadata(null, new PropertyChangedCallback(Callback)));

    public static void SetInputBindings(UIElement element, IEnumerable<InputBinding> value)
    {
        element.SetValue(InputBindingsProperty, value);
    }
    public static IEnumerable<InputBinding> GetInputBindings(UIElement element)
    {
        return (IEnumerable<InputBinding>)element.GetValue(InputBindingsProperty);
    }

    private static void Callback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        UIElement uiElement = (UIElement)d;
        uiElement.InputBindings.Clear();
        IEnumerable<InputBinding> inputBindings = e.NewValue as IEnumerable<InputBinding>;
        if (inputBindings != null)
        {
            foreach (InputBinding inputBinding in inputBindings)
                uiElement.InputBindings.Add(inputBinding);
        }
    }
}

Просмотр модели:

public partial class MainWindowViewModel
{
    public MainWindowViewModel()
    {
        KeyBinding kb = new KeyBinding { Key = Key.T, Command = MyCommand };
        InputBindings.Add(kb);
    }

    public List<InputBinding> InputBindings { get; } = new List<InputBinding>();

    public ICommand MyCommand => ...
}

Просмотр:

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="Window18" Height="300" Width="300"
        local:InputBindingsBehavior.InputBindings="{Binding InputBindings}">
    <Grid>

    </Grid>
</Window>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...