Глобальный диспетчер горячих клавиш/ярлыков в WPF Prism (MVVM)

Как я могу создать глобальную привязку горячих клавиш в приложении wpf prism, к которым модули могут динамически добавлять горячие клавиши?

Я пробовал следующее:

Привязка Window.InputCommands к ObservableCollection моего класса Hotkey (используя
общую службу в качестве модели) --> InputCommands не содержит доступного установщика

Работа с PreviewKeyDownEvent (EventToCommand) --> Нет надежных способов определить, нажата ли клавиша Ctrl или Alt (если не делать это самостоятельно в ViewModel). Мне не нравится такой подход.

Есть ли простой способ динамически добавлять привязки клавиш?


person quadroid    schedule 25.09.2013    source источник


Ответы (1)


Я не знаю, как легко динамически добавлять/удалять в чистом MVVM. Я хотел бы получить доступ к InputBindings из кода программной части, как вы должным образом отметили отсутствие установщика. Однако вы можете склониться к тому, чтобы сломать дизайн для этого случая, только изучив эти два: InputBindings и KeyGesture. Поэтому рассмотрите возможность создания пользовательского элемента управления для вашей оболочки.

    public ObservableCollection<HotkeyModel> Hotkeys { get; private set; }
    public class HotkeyWindow : Window
    {
        HotKeys = new ObservableCollection<HotkeyModel>();
        HotKeys.CollectionChanged += new NotifyCollectionChangedEventHandler(HotkeysChanged);
    }
    void HotkeysChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if(e.Action == NotifyCollectionChangedAction.Add)
        {
            foreach(HotkeyModel hk in e.NewItems)
                this.InputBindings.Add(new InputBinding(hk.Command), new KeyGesture(hk.Key, hk.Modifier));
        }
        else if(e. Action == NotifyCollectionChangedAction.Remove)
            ...
    }

Не устанавливайте InputBindings, вместо этого вы будете добавлять и удалять. Сохраните эту ObservableCollection горячих клавиш и следите за событием CollectionChanged. По мере их добавления и удаления вы добавляете и удаляете из InputBindings. При создании KeyGesture вы можете установить Keyboard. Модификаторы.

Таким образом, вы можете взять эту концепцию и экстраполировать ее на истинный и тщательный дизайн MVVM с прикрепленными свойствами/зависимостями, прикрепленными поведениями и т. д., чтобы придерживаться разделения View и ViewModel, которое мой приведенный выше пример пока игнорирует.

person bland    schedule 25.09.2013
comment
Я добавил AttatchedProperty, который принимает BindingCollection и отражает изменения в моей коллекции Window.InputCommands. Спасибо за предложение. - person quadroid; 25.09.2013