我已经尽力对问题进行了详尽的介绍,但您可能仍需要进一步的说明;如果碰巧是这种情况,请随时评论您的问题,我将更新该帖子以尽可能地回答。
昨天我在切换表单控件时遇到了一个很奇怪的问题。我在FormShown
和所有控件上都有一段时间的加载时间,但应该隐藏加载显示。拨动开关可以关闭除加载显示以外的所有内容的可见性,但是加载完成后,只有部分控件可见。
我逐步完成了将所有内容恢复为可见的代码,并确保所有内容确实都设置为Visible = true
。我认为这可能与控件上的Dock
属性有关,或者与TabIndex
或类似的东西有关,但是我在跟踪潜在问题时遇到了麻烦。
这是我用来切换控件可见性的代码:
private void ToggleAllControlVisibility() {
foreach (Control c in Controls)
ToggleControlVisibility(c);
}
private void ToggleControlVisibility(Control c) {
if (c.Name == "loadingContainer")
return;
if (!(c is SplitContainer || c is SplitterPanel))
c.Visible = !c.Visible;
foreach (Control child in c.Controls)
ToggleControlVisibility(child);
}
这是一个递归切换,其中所有子控件也被切换。在加载开始之前调用ToggleAllControlVisibility
方法,在加载完成之后再次调用。
现在您知道了问题,尤其是某些我不知道的控件(至少它们应该显示的方式)。以下面的控制树为例:
在上面的控件中,只有pTimePanel
实际上显示在前景中。我相信它的子控件可能会以某种方式显示在其后面,因为当我逐步执行代码并到达lblStartTime
控件时,我可以简要地看到标签的轮廓(无内容),然后将其移至下一个控制它消失了。 timeSlider
控件似乎没有表现出相同的行为,但确实返回到Visible = true
。
从表单到上述控件(具有停靠属性)的完整树如下:
splitContainer : Dock-Fill
panel1 (SplitterPanel)
loadingPanel (Panel) : Dock-Fill
pTimePanel (Panel) : Dock-Bottom
pTimeLabels (Panel) : Dock-Bottom
lblStartTime (Label) : Dock-Left
lblStopTime (Label) : Dock-Right
timeSlider (TrackBar) : Dock-Fill
其中一些可能没有其他方面有用,但由于我认为可能有助于弄清正在发生的事情,我将在此处添加它们。
Resize
上的loadingPanel
事件。什么可能导致这种奇怪的行为发生?
答案 0 :(得分:0)
事实证明,这与控件添加到表单的顺序有关。由于某些复制和粘贴控件,一会儿,事情就以不正确的顺序结束了。我必须从头开始重新构建表单,以使所有切换真正起作用。重建表格后,所有可用的切换选项都按照我期望的方式开始工作。