【C#,WPF】DataGridでキーボードのセル選択を無効化

【C#,WPF】DataGridでキーボードのセル選択を無効化

WPFのデータグリッドでは、マウスクリックによるセル選択の他に、矢印キー・エンターキー・タブキーなどのキーボード操作による選択も可能です。今回はこれらのキー操作を禁止し、マウスによるセル選択のみを有効にする方法を紹介します。

サンプルコード(XAML)

それでは早速、サンプルコードを載せていきます。
サンプルでは「DataGridKeySelectionDisable」というプロジェクトを作成しました。
まずは、XAML側のコードから見ていきます。

プロジェクト生成時のXAMLに、DataGridを1つ追加しています。
DataGridの「IsReadOnly」はTrueにし、読み取り専用としました。(8行目)
またイベントには「PreviewKeyDown」を設定しています。(9行目)
他に「KeyBoardNavigation」のプロパティを設定しています。(10~12行目)
こちらは、後ほど詳しく解説します。

サンプルコード(C#)

次に、C#側のコードを見ていきます。
まずコンストラクタで「InitializeDataGrid」メソッドを呼び、データグリッドの初期化をします。(29行目)
そして、XAMLで指定した「PreviewKeyDown」イベントの実装をしています。(44~52行目)

「InitializeDataGrid」メソッドでは、データグリッドに表示するデータを生成しています。(32~42行目)
プログラム実行によりキーボード操作を確認するとき用に、ダミーのDataTableを用意しました。
ダミーデータ作成に関する詳細な解説は、以下の記事をご覧ください。

【C#】DataTableにダミーデータを作成して表示する
データテーブルを生成して画面に表示する際に、実データがまだ準備できていない状況で、先に画面の見た目を確認したいときがあります。 そんなときはダミーデータを作成して、仮のレコードで

要点の解説

上記のソースをビルドし実行すると、マウスクリックでのセル選択は反応し、キーボードによる選択は不可能になっているのが確認できます。
コード内で重要なのは、以下2点です。

  1. KeyboardNavigationのプロパティ指定
  2. 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チェック時、禁止したいキー操作が出てきた場合などに、ご活用ください。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です