张天星

1992
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Load事件控件焦点问题

Posted on 2011-06-08 11:23  张天星123  阅读(645)  评论(0)    收藏  举报

决定一个控件是否可以被Focus的条件有两个:

  1. 一个是控件可见(bool visible = SafeNativeMethods.IsWindowVisible(new HandleRef(window, Handle));),
  2. 另一个是控件是可用的(bool enabled = SafeNativeMethods.IsWindowEnabled(new HandleRef(window, Handle)); )。

只有这两个条件同时具备时,才能支持控件设置焦点。

那么为什么Form_Load函数里面执行Focus()方法会失败呢?控件的Enable属性为true是肯定的,因为我从没有修改过控件的Enable属性,只有Visible属性有可能是false。也就是说在Form_Load方法在返回之前,程序的界面还没有显示呢。我们再做一个实验:
在按钮的事件响应函数里面填上this.txtTestTextBox.Focus();代码,测试一下。
编译,运行,此时焦点在Button上,拍下空格键,弹出MessageBox,确定之后,发现焦点已经转移到TextBox上了

这次是设置成功了。那么我们能否在Form_Load中也设置成功呢?肯定能啊,只要在调用Focus方法前让控件编程Visible就可以了。我们可以在Form_Load方法中加入一行this.Show();代码,如下:

private void Form1_Load(object sender, EventArgs e)
{
this.txtTestTextBox.Text = "测试一下";
this.Show();
this.txtTestTextBox.Focus();
}

这下界面显示出来时,焦点就在TextBox上了。说了这么多,其实就明白了一件事儿,一个控件要具有焦点,需要两个条件:一个是控件是可见的,另一个是控件是Enable状态的。