soundie
@soundie

Как отобразить несколько контролов одновременно?

На форме (WinForms) динамически создаётся поле размером 10 на 10. Каждая ячейка этого поля - это компонент PictureBox. После того как компоненты созданы и настроены через обычный двойной цикл происходит их отображение (Visible устанавливается в true). Отображаются они по очереди, что заметно глазу. При этом по логике игры нужно чтобы они появились одновременно (по крайней мере с наиболее низкой задержкой из возможных, чтобы глаз не заметил или почти не заметил).

Пробовал Parallel.For и Task.Factory - не отображаются все ячейки и програма к тому же зависает. Пробовал async/await, пробовал создавать под ячейки контейнер (ещё один PictureBox и показывать только его когда всё остальное там загрузится) - результат такой же как и с обычным двойным циклом.

Как можно показать контролы одновременно?

UPDATE: Может WPF лучше для таких целей подойдёт в плане скорости отображения множества картинок?
  • Вопрос задан
  • 71 просмотр
Решения вопроса 1
VoidVolker
@VoidVolker Куратор тега C#
Dark side eye. А у нас печеньки! А у вас?
Просто используйте WPF - там нет таких проблем с производительностью. У WinForms проблема с производительностью связана с использованием древнего GDI API. И, если хочется решить эту проблему - то в таком случае надо вручную писать рендеры для контролов. В данном случае это будет так: создать кастомный контрол и написать к нему кастомный рендер, который будет брать картинки и копировать их всех в один канвас/буфер, так же в самом этом контроле обрабатывать события пользовательского ввода. Плюс потребуется найти и применить дополнительные хаки для повышения производительности, такие как добавление специальных флагов стилей к окну, переписывание дополнительных методов в контролах и прочее. Проверено на личном опыте.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы