今回は、C#(WPF)のキー押下時のイベント、
「Ctrl」キー+「A」キーでListBox(リストボックス)の内容を全選択するときの実装についてです。
リストボックスにはSelectAll関数という便利な関数がないため、自分で選択状態としていく必要があります。
キーを押した時にイベントを起こす
まずは「Ctrl」+「A」キーを押した時のイベントを拾っていきます。
コントロールのキーダウン時にはイベントは2つあります。
KeyDownというイベントとPreviewKeyDownというイベントがあります。
キーが押下されると、そのときフォーカスれていたコントロールを格納しているコントロールが、より親のコントロールから順にキーイベントを発生してきますが、今回はリストボックスのみに焦点をおいてみました。
今回は使うイベントはPrebirewKeyDownイベントを使用します。
”PrevirewKeyDown”と”KeyDown”のイベントの違いについて
は後に記載しようと思います。
リストボックスを全選択する
次にリストボックスを全選択していきます。
●方法1 for文で1つずつ選択する
●方法1 // for文でSetSelectedにより1つずつ選択 private void listBox1_PrevirewKeyDown(object sender, KeyEventArgs e) { if ((e.KeyCode == Keys.A) && (e.Control)) { for (int i = 0; i < listBox1.Items.Count; i++) { listBox1.SetSelected(i, true); } } }
●方法2 ListBoxのSelectedIndexCollection.Addで追加する
●方法2 // ListBox.SelectedIndexCollection.Addで選択 private void listBox1_PrevirewKeyDown(object sender, KeyEventArgs e) { if ((e.KeyCode == Keys.A) && (e.Control)) { for (int i = 0; i < listBox1.Items.Count; i++) { listBox1.SelectedIndices.Add(i); } } }
●方法3 手動操作を再現させる
●方法3 // 手動操作を再現 private void listBox1_PrevirewKeyDown(object sender, KeyEventArgs e) { if ((e.KeyCode == Keys.A) && (e.Control)) { SendKeys.SendWait("{HOME}+{END}"); } }
■方法1~3について
方法1,2は数が多いと時間がかかってしまいます。
その上ちょっと不格好な処理になってしまいます。
そのため、方法3が一番見た目的によかったです。
方法3は、手動の操作である、
「一番上の項目をクリック,その後Shiftを押しながら一番下の項目をクリック」
を再現したコーディングとなっています。
キーストロークを送信するSendKeysクラスを使用し、一番上をクリックは「Home」キーで代用、一番下をクリックは「End」キーで代用しています。
”PrevirewKeyDown”と”KeyDown”のイベントの違いについて
WPFでは、コントロールのキーダウン時のイベントとして、
KeyDownというイベントとPreviewKeyDownというイベントがあります。
PreviewKeyDownイベントKeyDownイベントの前に発生するイベントです。
PreviewKeyDownイベントはKeyDownやKeyUpイベントが発生しないようなキーが押された場合もイベントは通知され、押されたキーを知ることができたり、KeyDown処理前にKeyDownのイベント処理を行わないようにするのに使用します。
また、PrevirewKeyDownイベントでは、IMEがOnの状態で押されたキーも確認できます。
ちなみにコントロールが複数ある場合は、
Window → リストボックス
の順にキーダウンのイベントは発生します。
コメント