速记
我试着尽可能彻底地回答我的问题,但你可能还需要更多的澄清;如果真是这样,请随意评论你的问题,我会更新帖子,尽可能地回答他们。
昨天我在切换窗体控件时遇到了一个相当奇怪的问题。我有一段时间
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
提高了。
问题
有什么可能使这种奇怪的行为成为可能?