快速说明
我试着尽可能彻底地回答我的问题,但你可能还需要进一步的澄清;如果碰巧是这种情况,请随时评论您的担忧,我会更新帖子,尽我所能回答他们。
昨天我在窗体上切换控件时遇到了一个相当奇怪的问题。我在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
事件
问题
可能发生了什么使这种奇怪的行为成为可能?
事实证明,这与控件添加到表单的顺序有关。由于一些复制和粘贴控件的原因,一些东西的顺序不正确。我不得不从头开始重新构建表单,以使任何切换都能真正工作。一旦我重建了表单,所有可用的切换选项都开始以我期望的方式工作。