【发布时间】:2019-04-06 01:15:10
【问题描述】:
为了简化情况,我有一个面板,上面有 3 个文本框。当我隐藏面板时,面板的选项卡顺序中的第一个文本框被分配给 Me.ActiveControl(表单),无论面板隐藏时关注的是哪个。
我认为隐藏控件永远无法获得焦点。我在最初发现问题的表单上有其他控件,所以我认为它必须选择一个非隐藏控件来关注。这是一个错误,还是这样设计的?
我在我的简单表单上使用了一个计时器,它每 5 秒触发一次,在标签中记录活动控件名称。
【问题讨论】:
为了简化情况,我有一个面板,上面有 3 个文本框。当我隐藏面板时,面板的选项卡顺序中的第一个文本框被分配给 Me.ActiveControl(表单),无论面板隐藏时关注的是哪个。
我认为隐藏控件永远无法获得焦点。我在最初发现问题的表单上有其他控件,所以我认为它必须选择一个非隐藏控件来关注。这是一个错误,还是这样设计的?
我在我的简单表单上使用了一个计时器,它每 5 秒触发一次,在标签中记录活动控件名称。
【问题讨论】:
我已经能够重新创建你的场景,它揭示了一个有趣的可能性(稍后会详细介绍)。
WinForms 具有Selected(或激活)控件的概念。 Control.Select Method 与 Control.Focus Method 相关。 Focus Method-Remarks section 文档是相关的。
如果满足以下所有条件,则可以选择控件并接收输入焦点 是 true:ControlStyles 的 Selectable 值设置为 true,它是 包含在另一个控件中,并且它的所有父控件都是 可见且已启用。
...
Focus 是一种低级方法,主要用于自定义控件 作者。相反,应用程序程序员应该使用 Select 方法 或子控件的 ActiveControl 属性,或激活 表单的方法。
ContainerControl.ActiveControl Property 指向最后一个选择控件。
之所以选择Panel 中的第一个按Tab 顺序进行控制是因为Panel.Visible 属性设置为false 时执行的代码。 Visible Property setter 调用SetVisibleCore,然后调用SelectNextIfFocused,然后调用SelectNextControlInternal,最后调用Control.SelectNextControl,选择你的TextBox1。
这就是有趣的地方。此时Panel 和TextBox 都可见。因此,TextBox 接收焦点并在 Panel 隐藏时保留它。此条件允许隐藏的TextBox 具有键盘输入,并且不会违反有关隐藏控件无法接收焦点的规则。
【讨论】: