我有一个带有 3 个面板的表单,创建面板是因为在某些时候我需要隐藏/显示某些控件组。到现在为止,它工作得很好——直到我被要求有一种特定的方式来使用 TAB 键导航表单。
首先,我注意到 Panel 对象中没有 TabIndex 属性,最重要的是,我不想遵循嵌套导航算法,我只想设置自己的序列。
从我目前在网上阅读的内容来看,面板不可能做到这一点。我唯一的选择是将表单上的所有控件放在同一个面板中。
有什么想法吗?我不想重新安排应用程序,并开始隐藏和显示各个控件。
我有一个带有 3 个面板的表单,创建面板是因为在某些时候我需要隐藏/显示某些控件组。到现在为止,它工作得很好——直到我被要求有一种特定的方式来使用 TAB 键导航表单。
首先,我注意到 Panel 对象中没有 TabIndex 属性,最重要的是,我不想遵循嵌套导航算法,我只想设置自己的序列。
从我目前在网上阅读的内容来看,面板不可能做到这一点。我唯一的选择是将表单上的所有控件放在同一个面板中。
有什么想法吗?我不想重新安排应用程序,并开始隐藏和显示各个控件。
按 TAB 键会将焦点移动到 ControlCollection 中的下一个控件。由于焦点始终在 Panel 内的控件中,而不是在面板本身中,您怎么能期望 Panel 支持选项卡索引?
我建议你再想想你想要做什么。当特定面板可见时,TAB 应该在其中的控件周围导航。TAB 将您移到下一个面板中是没有意义的。这通常通过按钮或其他控件来完成。用户期望 TAB 移动焦点而不执行操作。此外,如果您想让 TAB 让您在面板中移动,那么您需要将所有控件的 Tab Stop 属性设置为 false。
我遇到过同样的问题。我的解决方案是将所有控件放在表单的子面板中。.net 算法的制表符是使用 TabIndex 在“当前”容器内进行制表符。如果容器中的任何 TabIndexes 相同,则 z 顺序中的第一个将是第一个,依此类推。
一旦进入容器(表单就是容器),除了容器(面板)之外的所有控件都首先被选项卡标记。当离开最后一个非容器控件时,面板被递归到。
因此,如果所有控件都放置在同一级别的容器/面板中,则您的选项卡将按照您的预期完成。
示例问题:
形式 控制1 Tabindex = 1 面板1 control2 Tabindex=2 控制3 Tabindex=2 面板2 control4 Tabindex=4 control5 Tabindex=5 control6 Tabindex=6
选项卡将按以下顺序(不是您所期望的):
控制1 Control6 <-- 不是您想要/期望的 控制2 控制3 控制4 控制5
要使其正确进入制表符,请按以下模式布局:
形式 面板0 控制1 Tabindex = 1 面板1 control2 Tabindex=2 控制3 Tabindex=2 面板2 control4 Tabindex=4 control5 Tabindex=5 面板3 control6 Tabindex=6
我认为您几乎被困在那里-我不知道有任何直接的方法可以避免嵌套导航。
但是,我会说显示/隐藏控件组真的没什么大不了的:
private void SetPrimaryControlVisibility(bool visible)
{
ctrlA.Visible = visible;
ctrlB.Visible = visible;
ctrlF.Visible = visible;
}
private void SetSecondaryControlVisibility(bool visible)
{
ctrlC.Visible = visible;
ctrlE.Visible = visible;
ctrlG.Visible = visible;
}
这需要更多的代码编写——但这花了我 20 秒。如果它们都在表单表面上,您可以使用选项卡索引。
虽然现在我想起来了,他们在自己的面板上有什么问题?如果您使用面板来显示/隐藏,那么无论如何您都不会切换到其他面板。
另一种选择是编写关键事件处理程序,但我会远离——这将是一个无法维护的巨大混乱。