【C#,WPF】DataGridでキーボードのセル選択を無効化
WPFのデータグリッドでは、マウスクリックによるセル選択の他に、矢印キー・エンターキー・タブキーなどのキーボード操作による選択も可能です。
今回はこれらのキー操作を禁止し、マウスによるセル選択のみを有効にする方法を紹介します。
サンプルコード(XAML)
それでは早速、サンプルコードを載せていきます。
サンプルでは「DataGridKeySelectionDisable」というプロジェクトを作成しました。
まずは、XAML側のコードから見ていきます。
プロジェクト生成時のXAMLに、DataGridを1つ追加しています。
DataGridの「IsReadOnly」はTrueにし、読み取り専用としました。(8行目)
またイベントには「PreviewKeyDown」を設定しています。(9行目)
他に「KeyBoardNavigation」のプロパティを設定しています。(10~12行目)
こちらは、後ほど詳しく解説します。
サンプルコード(C#)
次に、C#側のコードを見ていきます。
まずコンストラクタで「InitializeDataGrid」メソッドを呼び、データグリッドの初期化をします。(18行目)
そして、XAMLで指定した「PreviewKeyDown」イベントの実装をしています。(33~41行目)
「InitializeDataGrid」メソッドでは、データグリッドに表示するデータを生成しています。(21~31行目)
プログラム実行によりキーボード操作を確認するとき用に、ダミーのDataTableを用意しました。
ダミーデータ作成に関する詳細な解説は、以下の記事をご覧ください。
サンプルコードの要点解説
上記のソースをビルドし実行すると、マウスクリックでのセル選択は反応し、キーボードによる選択は不可能になっているのが確認できます。
コード内で重要なのは、以下2点です。
- KeyboardNavigationのプロパティ指定
- PreviewKeyDownのイベント実装
1つずつ説明していきます。
1. KeyboardNavigationのプロパティ指定
XAMLコード「KeyboardNavigation」のプロパティをNoneに指定することで、タブや矢印キーで他コントロールから移動してくるフォーカス選択を無効化できます。
サンプルでは、以下の3つをNoneにしています。
- TabNavigation:[Tab]キーによるフォーカス
- ControlTabNavigation:[Ctrl] + [Tab]キーによるフォーカス
- DirectionalNavigation:[矢印]キーによるフォーカス
2. PreviewKeyDownのイベント実装
上記「KeyboardNavigation」をNoneにすれば、タブキーなどで他コントロールから来る選択を禁止します。
しかし、マウス選択でデータグリッドにフォーカスがあたると、その後はキー操作の選択が有効となります。
そこで「PreviewKeyDown」イベントを使用し、フォーカス後のキー操作も無効化していきます。
C#コード「PreviewKeyDown」イベントで、if文により押されたキーの種類を判定しています。
無効対象キーの場合、KeyEventArgsのHandledプロパティをtrueにし、キー操作をキャンセルします。
サンプルでは「矢印キー(Up, Down, Left, Right)、エンターキー(Enter)、タブキー(Tab)」を、無効対象のキーとしています。
これで他コントロールからのキー操作によるフォーカス移動でのセル選択と、データグリッドにフォーカスが移動後のキー操作によるセル選択、両方を禁止することができました。
サンプルのソースコード一式
GitHubに、サンプルプロジェクトのソース一式を公開しています。
GitHub – Kuwayoshi/DataGridKeySelectionDisable
実際に動かしてみたい方などは、上記ページからダウンロードしてください。
まとめ:プロパティやイベントでキーボードによるセル選択を無効化
データグリッドの操作時に、キーボードによるセル選択を無効化する方法を紹介しました。
「KeyboardNavigation」のプロパティは、タブオーダーを指定する際などにも活躍します。
また「PreviewKeyDown」イベントも、データグリッドに限らず様々なキー制御をする際に便利です。
キーボードのUIチェック時、禁止したいキー操作が出てきた場合などに、ご活用ください。
コメントを残す