すべてのメニュー/ contextmenus /ツールバーはかなりこのようにViewModelにコード内で宣言されています「純粋な」MVVMのMenuItemキーボードショートカット?私は、WPFで使用
MenuService.Add(new MenuItem()
{
Header = "DoStuff",
Command = new relayCommand(DoStuff,() => CanDoStuffExecute())
// some more properties like parent item/image/...
});
MenuServiceは、MenuItemのの階層リストであり、実際のメニューのにバインドされます単一の結合ポイントを提供しますItems xamlのソース。
これは非常にうまくいきましたが、同じように便利な方法でキーボードショートカットを追加したいと思います。 理想のMenuItemはので、私は単に項目のコマンドにつながる
Shortcut = new KeyGesture(Key.D, ModifierKeys.Control)
はメニューを所有するウィンドウでCtrl + Dを押す時に呼び出されて書くことができるタイプSystem.Windows.Input.KeyGesture
の財産になるだろう、とこれも希望メニューに「Ctrl + D」と表示されます。
私はここで失われています:私は、データバインディングを介してMenuItem.InputBindingsコレクションを設定したいが、取得専用です。とにかくアイテムをどうやって入手できますか?または、既にこのようなものをサポートしているMVVMフレームワークはありますか?ほとんどのq &はキーボードショートカットにありますが、xamlを使ってショートカットを設定するのは助けにはなりません。 「routeduicommand対relaycommandと 『relaycommand keygesture』などの検索
更新
はハックソリューションしかし、作業を考え出すのに十分な情報を明らかにしました。間違いなくそこに他のより良い方法がありますが、現時点ではこれは私にとって非常に低い優先事項であり、仕事を完璧にしています。私はこのようなMenuItemクラスに2つのプロパティを追加しました:
//Upon setting a Gesture, the original command is replaced with a RoutedCommand
//since that automatically gives us proper display of the keyboard shortcut.
//The RoutedCommand simply calls back into the original Command.
//It also sets the CommandBinding property, which still has to be added to the
//CommandBindingCollection of either the bound control or one of it ancestors
public InputGesture Gesture
{
set
{
var origCmd = Command;
if(origCmd == null)
return;
var routedCmd = new RoutedCommand(Header,
typeof(System.Windows.Controls.MenuItem),
new InputGestureCollection { value });
CommandBinding = new CommandBinding(routedCmd,
(sender, args) => origCmd.Execute(args.Parameter),
(sender, args) => { args.CanExecute = origCmd.CanExecute(args.Parameter); });
Command = routedCmd;
}
}
//CommandBinding created when setting Gesture
public CommandBinding CommandBinding { get; private set; }
だから、これは(すなわち、それらは等を簡単に設定されているコード内のキーボードショートカットを追加する)私はもともとを求めた機能を提供します。コマンドバインディングを登録するだけです。現時点では、これらのすべてをApplication.Current.MainWindow.CommandBindingsに追加するだけで完了します。
いくつかのコードサンプルを提供できますか?私はxamlで完全なメニューを定義するべきですか?または単にショートカットですか?私はどのように見たいのですか?プラグインがサブメニューを自由に追加できるグローバルな 'ツール'メニューのようなものが必要です - xamlでもできますか?またそれを行うことができます、それはちょっとxamlでコードを捨てるでしょうか?今私はメニューコマンドを追加する必要があるように、コードが表示されます。それは得ることができるように短く、便利であり、それはbeatifully働く。 Btwのレンガ壁は2つの方向で機能します:私はまだ、UXの部分がコードで定義されていない大規模なアプリケーションを見なければなりません。それは神話です。 – stijn
あなたは本当に正しいです。私は、コードを避けようとするのは本当に大変だったWPF UXプロジェクトを見てきました。私はちょうどどちらの方法でも簡単に使えるようにしようとしています。 ここにサンプルスニペットがあります(中国人の不在を赦してください - 私はこのウェブサイトでこれをどのようにフォーマットするのか不明です)。 '
editあなたの答えは、コードを貼り付け、それを選択し、*コードサンプル*ボタンをクリックしてください。 – stijn