WPF Prism(MVVM)中的全局热键/快捷方式管理器

时间:2013-09-25 11:45:54

标签: c# wpf mvvm prism-4

如何在wpf prism应用程序中创建全局热键绑定,哪些模块可以动态添加热键?

我尝试了以下内容:

Window.InputCommands绑定到我的Hotkey类的ObservableCollection(使用
   共同服务作为模型)      - > InputCommands不包含可访问的setter

使用PreviewKeyDownEvent(EventToCommand)      - >没有可靠的方法来确定是否按下了Ctrl或Alt(通过执行此操作)     我自己在ViewModel中)。我不喜欢这种做法。

有没有简单的方法动态添加键绑定?

1 个答案:

答案 0 :(得分:1)

我不知道如何在纯MVVM中轻松动态地添加/删除。我想从代码隐藏中访问InputBindings,因为你正确地指出缺少setter。但是,您可能倾向于仅通过查看这两个案例来打破此案例的设计:InputBindingsKeyGesture。因此,请考虑为shell创建自定义控件。

    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.Modifiers

所以你可以把这个概念推断成一个真正彻底的MVVM设计,带有附加/依赖属性和附加行为等,以坚持我上面的例子现在忽略的View和ViewModel分离。