ToggleButton自体のInputBindingはうまくいきませんが、問題に対する2つの優れたWPFソリューションがあります。
- モデルを更新するRoutedCommandを使用します。
- アクセスキーを登録します。
InputBindingソリューションが機能しない理由
コマンドがリストされていないため、現在定義しているInputBindingは機能しません。次のように、ボタンを切り替えるコマンドを簡単に作成できます。
public void Execute(object parameter)
{
((ToggleButton)parameter).IsChecked = !((ToggleButton)parameter).IsChecked;
}
しかし、これはあなたが探しているものを達成しません。ボタンがフォーカスされていない場合でも、 Ctrl-Hでボタンを切り替える必要があります。InputBindingは、ボタンにフォーカスがある場合にのみ機能するため、これを実現しません。次に、使用できる2つのソリューションについて説明します。
オプション1:モデルを更新するRoutedCommandを使用する
WPFのアーキテクチャの要点は、そもそも「ボタンを切り替える」必要がないということです。概念的には、WPFのすべてのキーボードとマウスのアクションは、モデルまたはビューモデルのバインドされたプロパティを切り替えるのに役立つはずです。ToggleButtonは、マウスクリックを受け入れるためのメカニズムになりますが、それだけである必要はありません。
「IsShowHistoryChecked」プロパティに選択した名前は、ビューモデルを概念化する方法の根本的な問題を示しています。ビューモデルは、ビューを中心に設計するのではなく、「ShowHistory」プロパティなどの論理的な概念を公開する必要があります。ビューはこれをCheckBoxまたはToggleButtonにバインドするか、他のメカニズムを選択するか、まったく公開しない場合があります。データバインディングとビューモデルの全体的なポイントは、ビューモデルを作成するときに、実際のビューがどのようになるかを気にしないということです。実際、自動化された単体テスト中はチェックボックスがないため、「IsShowHistoryChecked」は明らかに本当の誤称になります。
したがって、ビューをビューモデルから適切に分離し、「ShowHistory」プロパティがあるとします。まず、ビューモデルに「ToggleShowHistory」コマンドを実装します。このコマンドを実行すると、ShowHistoryプロパティが切り替わります。これで、このコマンドにビューレベルでCtrl-HのInputBindingを割り当てるだけで、完了です。ToggleButtonがビューから完全に削除された場合でも、InputBindingは引き続き有効であり、Ctrl-Hは引き続き機能します。ニルヴァーナ。
オプション2:アクセスキーを登録する
Windowsには、キーを任意のボタンやラベルに関連付けるための標準的なメカニズムがあります。これが「アクセスキー」の概念です。ToggleButtonに「h」のアクセスキーを登録する場合、Alt-Hを押すとボタンが切り替わります。したがって、TextBoxがない場合、または別のコントロールが最初にそれを受け入れる場合は、単純なHになります。
アクセスキーをコードに登録するのは非常に簡単です。
AccessKeyManager.Register("h", togleButton);
アクセステキストとして「h」を登録します。これで、ユーザーがスコープ内の任意の場所でAlt-H(または、TextBoxで処理されていない場合はプレーンな「h」)を押すと、ボタンが切り替わります。
XAMLでも実行できます。ボタンにテキストを表示している場合は、アクセスキー文字の前にアンダースコアを使用してください。
<Button Text="Show _History" ... />
テキスト以外のものを表示している場合は、ボタンのコンテンツに非表示のAccessText要素を含めます。
<Button ...>
<Grid>
<AccessText Text="_h" Visibility="Collapsed" />
<Image ...>
</Grid>
</Button>
ご参考までに、WPFには、AccessKey登録がAltではなくCtrlに応答するように要求するメカニズムが組み込まれていないため、Ctrl-Hをアクセスキーとして設定することはできません。