在WinForms中,要将焦点设置为特定控件,我似乎总是调用 Control.Select() Control.Focus()让它发挥作用。

有什么区别,这是正确的做法吗?

有帮助吗?

解决方案

  

Focus是一种低级方法,主要用于自定义控件作者。相反,应用程序员应该对子控件使用Select方法或ActiveControl属性,或者对表单使用Activate方法。

http://msdn.microsoft。 COM / EN-US /库/ system.windows.forms.control.focus.aspx

其他提示

Focus()是实际设置焦点的低级功能。

Select()是一种高级方法。它首先在控件的父层次结构中以迭代方式向上查找,直到找到容器控件。然后它设置该容器的ActiveControl属性(到被调用的控件)。但是,这些方法中的逻辑并不简单,并且对UserControl容器有特殊处理。

有关它们如何不同的示例,如果您尝试将窗体应用程序的控件设置为默认焦点时打开它,则只有Select()在InitializeComponent()之后在构造函数中调用时才有效。焦点()不会。

只是为了添加到这个线程,我发现在编写一个用户控件时,将其他控件从一个窗体移动到另一个窗体(新创建的窗体)。原始表单无法再选择控件,但使用焦点允许它这样做。我认为这强调了这些方法工作水平的答案。但这也意味着说使用选择在较高级别并不简单,因为选择不再按照预期在原始形式上工作(不是因为它应该将其放入不同的形式 - 我接受它)

在某些情况下,Focus()会导致拥有控件的窗口在没有焦点的情况下获得焦点。 Select()不会导致窗口聚焦。

根据个人经验,我编写了一个继承Windows ComboBox的用户控件。我不得不编写代码来覆盖 OnEnter 事件,我在那里有一个声明

If Me.Focused Then ... Else ...

然而,遗憾的是它返回了意想不到的结果。如果我调用 MyCustomerComboControl.Select (在Load,Shown或Activated事件中)它调用了 OnEnter 方法但是没有注册它有焦点(即Focused为False)但是如果我打电话给福克斯它是有效此外选择如果表格是打开的,即如果我选择了另一个控件,然后重新选择原始控件,则一切正常。因此,除了我的场景之外的任何其他情况,请使用选择,因为它在上面说明了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top