標準の機能としてはありません。
おそらく挙動が曖昧になるためだと思われます。
どういうことかというと、たとえば「123 aa」と「234 bb」の項目があって、
1, 2, 3 の順でキー押下した場合に、押下するスピードによって
「123」の入力とみなされ、「123 aa」が選択される
「1」と「23」の入力とみなされ、「123 aa」が選択された後に「234 bb」が選択される
というように動きが変わってしまって使いづらいのでは?ということです。
それを承知の上で実現したいのであれば、おっしゃるとおり
Keyイベントから自前で実装することになるかと思います。
一応以下に簡易に作ってみたサンプルを載せておきますが、
個人的な意見としては、キーで選択したいなら、別にTextBoxを配置して
そこの入力文字から表示項目をインクリメンタルに絞り込む、とかのほうが
使いやすいのでは?という気もします。
C#
1 public class KeySelectionListBox : ListBox
2 {
3 //キーの連続入力を待機する時間(ミリ秒)
4 const int KeyPressContinueTimeout_ms = 200 ;
5
6 //入力された文字をためておく
7 readonly List < char > pressedChars = new List < char > ( ) ;
8
9 //入力が継続している場合に選択処理をキャンセルするためのもの
10 CancellationTokenSource preTaskTokenSource ;
11
12 protected override void OnKeyPress ( KeyPressEventArgs e )
13 {
14 //もともとの先頭文字選択の動きを無効化
15 e . Handled = true ;
16
17 lock ( pressedChars )
18 {
19 pressedChars . Add ( e . KeyChar ) ;
20 }
21
22 //入力が継続しているので、確定待機中であればキャンセルしておく
23 if ( preTaskTokenSource != null )
24 {
25 preTaskTokenSource . Cancel ( ) ;
26 preTaskTokenSource = null ;
27 }
28
29 var tokenSource = new CancellationTokenSource ( ) ;
30 preTaskTokenSource = tokenSource ;
31
32 Task . Delay ( KeyPressContinueTimeout_ms , tokenSource . Token ) . ContinueWith ( t = >
33 {
34 if ( t . IsCanceled ) return ;
35
36 string input ;
37
38 lock ( pressedChars )
39 {
40 input = new string ( pressedChars . ToArray ( ) ) ;
41 pressedChars . Clear ( ) ;
42 }
43
44 //先頭から一致する項目があれば選択
45 var item = this . Items
46 . Cast < object > ( )
47 . FirstOrDefault ( i = > i . ToString ( ) . StartsWith ( input ) ) ;
48 if ( item != null ) this . SelectedItem = item ;
49
50 } , TaskScheduler . FromCurrentSynchronizationContext ( ) ) ;
51
52 }
53 }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/16 13:43