2

モジュールがホットキーを動的に追加できる wpf プリズム アプリケーションでグローバル ホットキー バインディングを作成するにはどうすればよいですか?

私は次のことを試しました:

をホットキー クラスの にバインドするWindow.InputCommands( モデルとして共通サービスを使用) --> InputCommands にはアクセス可能なセッターが含まれていませんObservableCollection

( EventToCommand PreviewKeyDownEvent) の操作 --> Ctrl または Alt が押されているかどうかを判断する確実な方法はありません (ViewModel で自分で行うことから)。私はこのアプローチが好きではありません。

キーバインディングを動的に追加する簡単な方法はありますか?

4

1 に答える 1

1

純粋な MVVM で簡単に動的に追加/削除する方法がわかりません。セッターがないことを正式に指摘したように、コードビハインドからInputBindingsにアクセスしたいと思います。ただし、 InputBindingsKeyGestureの 2 つを調べるだけで、このケースの設計を崩したくなるかもしれません。そのため、シェルのカスタム コントロールを作成することを検討してください。

    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 の分離に固執することができます。

于 2013-09-25T15:10:14.520 に答える