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



快速说明

我试着尽可能彻底地回答我的问题,但你可能还需要进一步的澄清;如果碰巧是这种情况,请随时评论您的担忧,我会更新帖子,尽我所能回答他们。


昨天我在窗体上切换控件时遇到了一个相当奇怪的问题。我在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(面板(
    • 时间滑块(TrackBar(
    • lblStartTime(标签(
    • lbl停止时间(标签(

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

注释

其中一些可能没有其他的那么有用,但当我想到可能有助于澄清正在发生的事情时,我会在这里添加它们。

  • 在任一方向切换可见性时,会引发loadingPanel上的Resize事件

问题

可能发生了什么使这种奇怪的行为成为可能?

事实证明,这与控件添加到表单的顺序有关。由于一些复制和粘贴控件的原因,一些东西的顺序不正确。我不得不从头开始重新构建表单,以使任何切换都能真正工作。一旦我重建了表单,所有可用的切换选项都开始以我期望的方式工作。

最新更新