WinForm控件焦点的使用

在C#的桌面应用程序开发中,一般是一个页面(Form),然后里面摆着很多个控件(control). 所谓焦点就是你当前选中了哪个控件,该控件就获得了焦点.比如你用鼠标点下某个控件,或者通过快捷键选中某个控件. 如果是可编辑的区域会有一个一闪闪的竖线在那,如果不可编辑的一般会有些高亮显示.

焦点的用处是啥

焦点的概念不会在代码中经常用到.但有两个我们很熟悉的场景里会常用到.

一个场景是,当我们在某个页面填写一堆注册信息,然后点提交.如果哪项没填你就报个错.然后呢就让那个文本区域获得焦点.这样用户就可以直接输入内容,不需要再动下鼠标点击下获得焦点再输入.所以指定某个控件获得焦点可以方便用户的操作.

二个场景是,你用visual studio时,点下F1这快捷键就会弹出帮助文档.而且帮助文档中显示的内容是跟你当前焦点所在的内容相关的.所以假如你要做一个产品,当用户焦点在一些编辑区域的时候你想让其点下F1也弹出相应帮助文档的话,就必须先判断是哪个控件获得了焦点.

焦点的具体用法

显式指定某控件获取焦点

假如有按钮btnOK,  文本框txtLogin.则让两者获得焦点的方法分别是调用btnOK.Focus(); 和 txtLogin.Focus();

其他控件也一样,调用下函数Focus()就ok了.

指定默认焦点

不过如果是一个页面一打开就要默认让某个控件获得焦点的话,貌似用Focus()这方法不行.

得在那个控件的属性(properties)中指定TabIndex为0,这样一打开窗口(Form),此控件就默认的获得了焦点.你可能会问TabIndex是干嘛的.我们会看到键盘左边有个Tab键,我们按它的时候会选中不同的控件,相当于不停的做切换. 而切换的顺序就是按TabIndex指定数字大小来的.所以如果你指定TabIndex为0,就相当于是第一个.就是默认的获得焦点了.

TabIndex值相同的特殊情况

但是每个控件的TabIndex的值可以相同的.你可能会问如果两控件TabIndex值相等了咋办的啊?

你凭经常觉得应该是值相同的话,排前面的应该获得焦点.按从上到下,从左到右的顺序.不过我试了下发现情况并非这样简单.假如从左到右有按钮btn1, 文本框txt2,文本框txt3 . 假如它们的TabIndex依次为3, 2, 1.那没问题,默认焦点就是TabIndex为1的txt3. 如果依次为3, 2, 2.因为txt2排前面,所以txt2获得焦点.

但如果三者的TabIndex都为3,情况就奇怪了.你可能觉得会是btn1获得焦点,因为它排最前面啊,但答案是错的.那好吧,应该是txt2,它排第2啊.可惜也不是.竟然是默认获得焦点的是txt3.而如果没有txt3的话,不管txt2的位置在哪都是txt2获得焦点.所以貌似是可编辑的控件获得焦点的优先级高于不可编辑控件.而如果相同优先级的话,当TabIndex相同时就选最后一个获得焦点.

当然默认情况所有控件TabIndex的值是不会相等的,你往窗口中拖第一个控件时TabIndex值是0,然后每增加一个控件,TabIndex就默认增加1.只要你自己手动去改TabIndex时才会可能改成一样.所以如果要手动改的话最后也别改成一样.要每个控件唯一才比较好.

判断哪个控件获得焦点

比如上面的情景2,如果你点F1快捷键时怎么判断当前是哪个控件获得焦点呢.有两种方法

一是遍历下页面(Form)里面的所有控件,然后做判断

foreach(  Control con in this.Controls)

{

  if(con.Focused)             //如果某个控件获得焦点,则其Focused值为true

     //do something

}

另外还有个更简单的办法

Control con = this.ActiveControl;       //显然这个方法更简单.

当然你可能会问,上面虽然得到一个获得焦点的Control,但我貌似还不知道是哪一个具体的控件啊,比如一个TextBox或Button啊.我们知道每个控件都有一个唯一的名字.你应该事先知道每个控件的名字的,然后通过if(con.Name == "txt1") 这样来判断是哪个控件. 然后再做转换.比如TextBox txt  = (TextBox) con;

当然如果你不想去知道具体是哪一个控件,只要知道控件类型就行了.那就这样 TextBox txt = con as TextBox; 如果转换成功了(即txt != null),那获得焦点的就为TextBox,如果不成功接着再转呗. 比如 Button btn = con as Button;

你可能感兴趣的:(WinForm控件焦点的使用)