Form
TextBox1
UserControl1
Button1
TextBox2
Form の ActiveControl プロパティに form.userControl1 をセットしてフォーカスを確認する
System.Diagnostics.Debug.WriteLine(this.userControl1.CanFocus);
// True
this.ActiveControl = this.userControl1;
System.Diagnostics.Debug.WriteLine(this.ActiveControl);
// WinFormsApp1.UserControl1
System.Diagnostics.Debug.WriteLine(this.userControl1.Focused);
// False
System.Diagnostics.Debug.WriteLine(this.userControl1.ContainsFocus);
// False
System.Diagnostics.Debug.WriteLine(this.userControl1.ActiveControl);
// null
userControl1.CanFocus が True なのでフォーカスできるはず
ActiveControl に代入後には ちゃんと中身が UserControl1 になってる
なのに userControl1 の Focused や ContainFocus は False
userControl1 の ActiveControl は null
フォーカスが行方不明
見た目上は初期位置の TextBox1 のまま
もしかして JavaScript であるようなイベントループに処理を返してから変わったり?
タイマーで 1 秒待ってから同じものを表示するようにしてみる
→全く同じ結果
ActiveControl とフォーカスは別?
だけど
this.ActiveControl = this.userControl1.button1;
にして 代入直後の時点でさっきと同じ内容を表示すると
WinFormsApp1.UserControl1
False
True
System.Windows.Forms.Button, Text: button1
ContainsFocus が True になっていて userControl1 の ActiveControl が button1 になってる
見た目上でもボタンにフォーカスがあたってる
this.ActiveControl = this.textBox2;
でもフォーカスが切り替わってカーソル位置も変わってる
UserControl だけ特殊みたい
Focus メソッドも使ってみる
this.userControl1.Focus()
WinFormsApp1.UserControl1
False
True
System.Windows.Forms.Button, Text: button1
「this.userControl1.button1」 を ActiveControl に設定したときと一緒で UserControl1 内の最初のコントロールにフォーカスがあたってる
UserControl 自体にはフォーカス当たらなそう
だけど UserControl1 の中身を空にしてから
this.userControl1.Focus()
すると
WinFormsApp1.UserControl1
True
True
(null)
フォーカスあたってるみたい
画面上ではどこにもフォーカスあたってるような見た目はなし