WPF アプリケーションの左上にリージョンがあり、これをグローバル ボタン バーにして、ユーザーが表示する画面を選択すると、適切なコンテンツがメイン リージョンに表示されます。右上には、その画面内のサブメニュー オプションを含むサブ ナビゲーション領域もあります。たとえば、ユーザーがメイン メニューから [メンテナンス] をクリックすると、サブ メニューに新規、更新、削除、編集などのオプションが表示されます。
私がしたいのは、テキスト ボタン名のリストと、ボタン クリックで呼び出すアクションの ICommand/Parameter ペアを指定するだけで、カスタム メニュー バーを作成する方法です。これを行う自然な方法は、依存関係プロパティ Title、Command、および CommandParameter を持つ MenuButtonViewModel クラスを用意することです。もう 1 つ、IsSelected も必要です。そのため、ユーザーが現在どの画面にいるかを視覚的に確認する方法があり、トグル ボタンのように動作する必要がありますが、一度にグループ内のボタンを 1 つだけ選択できます。時間。次に、バーのコンテンツが ObservableCollection にバインドされ、データ テンプレートを使用してボタン バーをレンダリングする UserControl を作成できます。
これまでにこれを行う方法をいくつか試しましたが、必要な視覚的動作を実現する方法がわかりません。これらは私の要件です
1) 背景を別のブラシ OnMouseOver に変更するためのボタン 2) ボタンが選択されると、グループ内の新しいボタンが選択されるまで、別のブラシが背景として表示されます。一気に選ばれる
私がこれまでにこれをやろうとした方法は
1) RadioButton を独自のクラスで拡張し、コマンドとコマンド パラメーターの依存関係プロパティを追加します。すべてのコントロールが同じグループ ID を持つように設定します。ラジオ ボタンの表示をオーバーライドして、マウスオーバーと選択のトリガーを備えたビジュアル ボタンのように見せるためのデータ テンプレート。
これは、1 つのことを除いて正常に動作します。グループ内のラジオ ボタンを選択すると、ラジオ ボタン グループ内のすべてのオプションを選択解除する方法はありません。たとえば、「メンテナンス」に移動してから「国」のサブメニューをクリックすると、国のメンテナンス画面が表示されます。その後、アプリの別の領域に移動し、メイン メニューから [ディール エントリ] を選択すると、ディール エントリ画面に移動します。次に [メンテナンス] をクリックすると、一般的な「メンテナンス」コンテンツが表示され、ラジオ ボタン グループで [国] が選択されているメンテナンス用のサブ メニュー コントロールが表示されますが、これは望ましくありません。メンテナンスに戻ると、すべてのサブメニュー オプションの選択が解除されます。一般的なメンテナンス ランディング ページのコンテンツを表示し、その画面のコンテンツを表示する前にサブ メニュー オプションを選択できるようにします。メンテナンスを初めてロードするときは何も選択されていませんが、オプションを選択すると、メンテナンス画面をリロードするときに再び何も選択されていません。
2) 次に、ListBox を拡張して、コンテンツの水平スタックパネルでスタイリングしてみました。各リストボックス項目は menubuttonViewModel です。これにより、一度に 1 つのオプションしか選択できず、ページから移動するときに選択をクリアできます。また、各リストボックス項目の上にマウスを置いたときに背景を変更することもできます。
リストボックスを操作できないのは、IsSelected トリガーの背景を変えることです。デフォルトの ListBoxItem テンプレートには、CSS で指定したものをオーバーライドするトリガーがあるようです。そのため、listboxitem または menubuttonviewmodel スタイルにどのようなトリガーを設定しても、背景は変化しません。listboxitem のデータとコンテンツ テンプレートを再定義する必要があると思いますが、このリストボックスにのみ適用するため、すべてのリストボックス項目に対するグローバル テンプレートの変更にはなりません。アプリの他の場所でリストボックスを使用できるようにしたいためです。この動作を継承せずに。
これらの2つのアプローチと、おそらく私が望むようにそれらの1つを機能させなければならない問題を解決する方法について、誰でも考えを与えることができますか?デフォルトのトリガーを使用しないように私のスタイルを変更し、IsSelected トリガーを機能させることができますか?