Элементы управления в панели скрыты, пока я не изменю размеры окна - PullRequest
0 голосов
/ 03 января 2019

У меня были проблемы с "отключением" элементов управления от панели. Однако, когда я вручную начинаю изменять размер формы, недостающие элементы управления начинают появляться после каждого изменения размера. Я создал тестовое приложение, чтобы показать эту проблему. Само приложение добавляет панель на главной форме. В этой панели я добавляю 10 групповых блоков, каждый из которых имеет 100 ярлыков. Ниже приведены шаги по созданию тестового приложения и воспроизведению проблемы (до сих пор я пробовал это только в .NET 4.6.1 и Visual Studio 2017)

  • Создание нового проекта Windows Forms
  • Обновите конструктор формы по умолчанию так, как показано ниже

    public Form1()
    {
        InitializeComponent();
    
        // My stuff
        var panContents = new Panel();
        panContents.AutoScroll = true;
        panContents.AutoSize = true;
        panContents.AutoSizeMode = AutoSizeMode.GrowAndShrink;
        panContents.Dock = DockStyle.Fill;
        for (int g = 10; g >= 0; g--)
        {
            var groupBox = new GroupBox();
            groupBox.AutoSize = true;
            groupBox.AutoSizeMode = AutoSizeMode.GrowOnly;
            groupBox.Dock = DockStyle.Top;
            groupBox.Text = "Group " + g;
    
            var mainPanel = new Panel();
            mainPanel.Dock = DockStyle.Fill;
            mainPanel.AutoSize = true;
            mainPanel.AutoSizeMode = AutoSizeMode.GrowOnly;
            for (int i = 100; i >= 0; i--)
            {
                var con = new Label();
                con.Text = "Label " + i;
                con.Height = 100;
                con.Dock = DockStyle.Top;
                mainPanel.Controls.Add(con);
            }
            groupBox.Controls.Add(mainPanel);
            panContents.Controls.Add(groupBox);
        }
    
        this.Controls.Add(panContents);
    }
    
  • Запустить проект (без изменения размера формы)

  • Прокрутите до нижней части формы, и вы заметите, что не все 10 групповых полей отображаются
  • Измените размер формы вручную, вы заметите, что некоторые недостающие метки и групповые блоки начинают появляться
  • Продолжайте изменять размер формы, пока не отобразятся все элементы управления

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

PS Я знаю, что могу обойти эту проблему с помощью вкладок или подкачки. Однако я хочу знать, почему я вижу поведение, которое я вижу (в идеале я хочу избегать использования вкладок или подкачки страниц)

1 Ответ

0 голосов
/ 04 января 2019

@ Яс,

Это была довольно интригующая проблема - не совсем уловил ее до загрузки / запуска вашего кода. Я согласен с Джими - что вы, вероятно, сталкиваетесь с внутренним ограничением, каким бы странным оно ни казалось. Как вы указали, настройка высоты / ширины формы не должна преодолевать ограничение. Так что, что бы ни происходило внутри, это немного странно и неожиданно.

Но у меня есть решение для вас: это по общему признанию клудж, но иногда это наш единственный вариант. Если спецификациям вашего проекта требуется форма, подобная той, которую вы представили, - форма, значение которой в конечном итоге превышает 100 000, тогда это решение должно отвечать всем требованиям.

Добавьте следующий код в конец кода инициализации Form1, показанного в исходном сообщении (см. Ниже). То, что я сделал, это программно «подправил» высоту формы очень немного - многократно - до тех пор, пока все панели не будут полностью отрисованы. Я думаю, это будет вашим лучшим выбором.

Кстати, я потратил немало времени на это. Я пробовал различные комбинации Refresh () на разных элементах управления, DoEvents () и т. Д., Но безрезультатно. Я даже пытался не использовать стыковку и автоматическое изменение размеров в пользу ручной настройки высоты и высоты (это тоже не работало). Таким образом, я думаю, что приведенный ниже код действительно единственный способ исправить это, кроме исправления от Microsoft.

** Чтобы приведенный ниже код работал, добавьте эту строку сразу после InitializeComponent () вашего кода; строка:

this.Show();

Затем добавьте этот код после закрывающей скобки вашего кода:

     // fix the panContents panel
     long currentMaximum = 0;
     while (true)
     {
        var preserveHeight = this.Height;
        // tweak the height
        this.Height += 1;
        // set it back the height
        this.Height = preserveHeight;

        // test to see if the scroll bar max remains at its previous value
        // if it does, we're done
        if (currentMaximum == panContents.VerticalScroll.Maximum)
           break;

        // otherwise, preserve the current maximum scroll bar position
        currentMaximum = panContents.VerticalScroll.Maximum;

        // now scroll to the bottom of the panel
        panContents.VerticalScroll.Value = panContents.VerticalScroll.Maximum;
        // necessary step to ensure scroll bar value is set
        panContents.PerformLayout();
     }

     // scroll to the top
     panContents.VerticalScroll.Value = 0;
     // necessary step to ensure scroll bar value is set
     panContents.PerformLayout();
...