2

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

我尝试了以下方法:

绑定Window.InputCommandsObservableCollection我的 Hotkey 类(使用
公共服务作为模型)--> InputCommands 不包含可访问的设置器

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

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

4

1 回答 1

1

我不知道如何在纯 MVVM 中轻松地动态添加/删除。我想从代码隐藏中访问 InputBindings,因为您适当地注意到缺少设置器。但是,您可能倾向于仅通过查看以下两个来打破这种情况的设计: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,而是添加和删除。保留 Hotkeys 的 ObservableCollection 并监听 Co​​llectionChanged事件。在添加和删除它们时,您可以在 InputBindings 中添加和删除。创建 KeyGesture 时,可以设置Keyboard.Modifiers

因此,您可以将这个概念外推到一个真实而彻底的 MVVM 设计中,该设计具有附加/依赖属性和附加行为等,以坚持我上面的示例暂时忽略的 View 和 ViewModel 分离。

于 2013-09-25T15:10:14.520 回答