Краткое примечание
Я постарался максимально подробно разобраться со своим вопросом, но вам все еще могут потребоваться дополнительные разъяснения;если это так, не стесняйтесь комментировать ваши проблемы, и я обновлю пост, чтобы ответить на них как можно лучше.
Вчера я столкнулся с довольно странной проблемой, когда переключал элементы управления намоя формаУ меня есть период загрузки на 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
вызывается до начала загрузки и снова после завершения загрузки.
A Более подробный взгляд
Теперь, когда вы знаете проблему, существуют определенные элементы управления, в частности такие, чтоЯ знаю, не показывают (по крайней мере, так, как они должны).Возьмите, например, следующее дерево управления:
- pTimePanel (Panel)
- timeSlider (TrackBar)
- lblStartTime (Label)
- lblStopTime (Label)
Из вышеперечисленных элементов управления на переднем плане отображается только 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
.
Вопрос
Что может возможночтобы такое странное поведение было возможно?