递归切换可见性后控件不可见?

时间:2018-11-28 15:00:03

标签: c# winforms controls toggle visibility

快速笔记

我已经尽力对问题进行了详尽的介绍,但您可能仍需要进一步的说明;如果碰巧是这种情况,请随时评论您的问题,我将更新该帖子以尽可能地回答。


昨天我在切换表单控件时遇到了一个很奇怪的问题。我在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(面板)
    • timeSlider(TrackBar)
    • lblStartTime(标签)
    • lblStopTime(标签)

在上面的控件中,只有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事件。

问题

什么可能导致这种奇怪的行为发生?

1 个答案:

答案 0 :(得分:0)

事实证明,这与控件添加到表单的顺序有关。由于某些复制和粘贴控件,一会儿,事情就以不正确的顺序结束了。我必须从头开始重新构建表单,以使所有切换真正起作用。重建表格后,所有可用的切换选项都按照我期望的方式开始工作。