2013-09-25 69 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