C#(WPF)キー押下時のイベント”Ctrl+A”でリストボックス内を全選択したい

C#

今回は、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 → リストボックス
の順にキーダウンのイベントは発生します。

コメント

タイトルとURLをコピーしました