代码之家  ›  专栏  ›  技术社区  ›  Hazel へいぜる

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

  •  0
  • Hazel へいぜる  · 技术社区  · 6 年前

    速记

    我试着尽可能彻底地回答我的问题,但你可能还需要更多的澄清;如果真是这样,请随意评论你的问题,我会更新帖子,尽可能地回答他们。


    昨天我在切换窗体控件时遇到了一个相当奇怪的问题。我有一段时间 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(标签)
      • lblstoptime(标签)

    在上面的控制之外,只有 pTimePanel 实际显示在前景中。我相信它的子控件可能以某种方式显示在它的后面,因为当我遍历代码并到达 lblStartTime 控件,我可以简单地看到标签的轮廓(没有内容),然后当它移到下一个控件时,它就消失了。这个 timeSlider 控件似乎没有显示相同的行为,但它确实返回到 可见=真 .

    从窗体到上述控件(具有停靠属性)的完整树如下所示:

    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 回复  |  直到 6 年前
        1
  •  0
  •   Hazel へいぜる    6 年前

    结果发现,这与控件添加到窗体的顺序有关。由于一些复制和粘贴控件,一段时间后,事情以不正确的顺序结束。我不得不从头开始重新构建表单,以便进行任何切换。一旦我重建了表单,所有可用于切换的选项都开始按我预期的方式工作。