在 WinForms 中,要将焦点设置到特定控件,我似乎总是最终调用Control.Select()
并 Control.Focus()
让它工作。
有什么区别,这是正确的方法吗?
在 WinForms 中,要将焦点设置到特定控件,我似乎总是最终调用Control.Select()
并 Control.Focus()
让它工作。
有什么区别,这是正确的方法吗?
Focus() 是实际设置焦点的低级函数。
Select() 是一个更高级别的方法。它首先在控件的父层次结构中向上迭代查找,直到找到容器控件。然后它设置该容器的 ActiveControl 属性(到被调用的控件)。然而,这些方法中的逻辑并不简单,并且对 UserControl 容器进行了特殊处理。
Focus 是一种低级方法,主要用于自定义控件作者。相反,应用程序程序员应该对子控件使用 Select 方法或 ActiveControl 属性,或对窗体使用 Activate 方法。
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.focus.aspx
例如,如果您尝试将 Forms App 的控件设置为打开它时的默认焦点,则在 InitializeComponent() 之后在构造函数中调用时,只有 Select() 将起作用。Focus() 不会。
只是为了添加到该线程中,我发现在编写将其他控件从一个窗体移动到另一个窗体(新创建的窗体)的用户控件时。原始表单无法再选择控件,但使用焦点允许它这样做。我认为这强调了有关这些方法工作水平的答案。但这也意味着说在更高级别使用 Select 不够简单,因为 select 在原始表单上不再按预期工作(不是我应该将它放入不同的表单 - 我接受)
在某些情况下,如果没有焦点,Focus() 可能会导致拥有该控件的窗口获得焦点。Select() 不会引起窗口的焦点抓取。
根据个人经验,我编写了一个继承 Windows ComboBox 的用户控件。我必须编写代码来覆盖该OnEnter
事件,并且我在那里有一个声明说
If Me.Focused Then ... Else ...
然而,不幸的是它返回了意想不到的结果。如果我调用MyCustomerComboControl.Select
(在 Load、Shown 或 Activated 事件中)它调用该OnEnter
方法但未能注册它有焦点(即 Focused 为 False)但如果我调用 Focus 它工作。此外Select
,如果表单是打开的,即如果我选择了另一个控件然后重新选择了原始控件,一切都很好。因此,在我的场景以外的任何其他情况下,请使用,Select
因为上面是这样说的。