2013-09-25 156 views
2

如何在wpf prism应用程序中创建全局热键绑定,模块可以动态添加热键?WPF Prism(MVVM)中的全局热键/快捷键管理器

我试过如下:

绑定Window.InputCommands我热键类的ObservableCollection(使用
共同服务为模型) - > InputCommands不包含accessable二传手

与合作PreviewKeyDownEvent(EventToCommand) - >没有确定的方法来确定Ctrl或Alt是否被按下(在ViewModel中,我自己做了 )。我不喜欢这种方法。

是否有任何简单的方法动态添加键绑定?

回答

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设计,附加/依赖属性和附加行为等,坚持视图和ViewModel分离,我的上面的例子现在忽略。

+0

我添加了一个AttatchedProperty,需要一个BindingCollection,反映了改变我的收藏Window.InputCommands。感谢您的建议。 – Console

+0

@console很高兴我能指出你在正确的方向! – bland