Добавление многих ярлыков в WinForm замедляется - PullRequest
2 голосов
/ 17 марта 2012

Я играю с WinForms и хотел бы добавить много меток с рамкой, чтобы создать какую-то сетку.Теперь добавить ярлыки достаточно просто:

for (int i = 0; i < 60; i++)
        {
            for (int j = 0; j < 60; j++)
            {
                var label = new Label();
                label.BorderStyle = BorderStyle.FixedSingle;
                label.SetBounds(i * 10, j * 10, 10, 10);
                this.Controls.Add(label);
            }
        }

Но это действительно очень медленно.Я почти вижу каждый квадрат, нарисованный индивидуально.При создании массива элементов управления и добавлении их с помощью Controls.AddRange () происходит то же самое.

Теперь, когда я рисую 3600 элементов управления, я могу представить, что это несколько медленно, но я не могу помочь, нодумаю, есть лучший способ сделать это.Когда я измеряю оператор Control.AddRange (), секундомер говорит мне, что он занимает около 1600 мсКажется, что фактическое рисование занимает немного больше времени.

Есть ли способ обойти это и сохранить приложение с большим количеством элементов управления быстрым и отзывчивым?

Ответы [ 3 ]

4 голосов
/ 17 марта 2012

НУЖНЫ ли вам отдельные элементы управления? С такими задачами я обычно перезаписываю onpaint в пользовательском контроле и рисую текст и поля самостоятельно. Затем, если вам нужен пользовательский ввод, просто поместите одно текстовое поле поверх вашего пользовательского текста.

2 голосов
/ 17 марта 2012

Получите подсказку из вашего Form1.Designer.cs:

this.SuspendLayout();

// code to add Labels

this.ResumeLayout(false);  // maybe use true
1 голос
/ 13 марта 2018

Рассмотрите возможность создания List<Control>, добавив элементы управления в ваш цикл. Затем добавьте элементы управления в коллекцию элементов управления формы только один раз после цикла, используя this.Controls.AddRange() для заполнения коллекции элементов управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...