Элемент управления не виден после рекурсивного переключения видимости? - PullRequest
0 голосов
/ 28 ноября 2018

Краткое примечание

Я постарался максимально подробно разобраться со своим вопросом, но вам все еще могут потребоваться дополнительные разъяснения;если это так, не стесняйтесь комментировать ваши проблемы, и я обновлю пост, чтобы ответить на них как можно лучше.


Вчера я столкнулся с довольно странной проблемой, когда переключал элементы управления намоя формаУ меня есть период загрузки на 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.

Вопрос

Что может возможночтобы такое странное поведение было возможно?

1 Ответ

0 голосов
/ 03 декабря 2018

Оказывается, это было связано с порядком, в котором элементы управления были добавлены в форму.Из-за некоторого контроля копирования и вставки некоторое время назад все оказалось в неправильном порядке.Я должен был перестроить форму с нуля, чтобы переключить ее на работу.После того как я перестроил форму, все доступные варианты переключения начали работать так, как я ожидал.

...