У меня есть форма Windows (С#.NET 3.5) с несколькими кнопками и другими элементами управления, которые назначены самой верхней панели, которая охватывает всю форму. Например, иерархия: Form → Panel → другие элементы управления.
Как только я назначаю BackgroundImage для панели, элементы управления рисуют очень медленно. У меня такой же эффект, если я использую свойство Form BackgroundImage и устанавливаю Panel BackgroundColor на "прозрачный". Кажется, что сначала создается окно с фоном, затем каждый элемент управления добавляется один за другим с небольшой задержкой до следующего рисования. Другими словами, вы можете фактически следовать порядку, в котором каждый элемент управления обращается к форме. После того, как все элементы управления будут нарисованы, как только этот эффект больше не произойдет, но отзывчивость формы все еще медленная.
В дизайнере Visual Studio я получаю тот же эффект, особенно заметно при перемещении элементов управления. Иногда чертеж формы полностью останавливается на секунду или два, что делает работу с BackgroundImage полным перетаскиванием как в дизайнере, так и в результате приложения.
Конечно, я попытался использовать DoubleBuffered = true, и я также установил его на всех элементах управления, используя отражение, без эффекта.
Кроме того, здесь код загрузки форм, потому что это немного необычно. Он копирует все элементы управления из другой формы в текущую форму. Это делается для того, чтобы иметь возможность редактировать визуальный внешний вид каждого экрана отдельно с помощью дизайнера при совместном использовании общей формы и общего кода. У меня есть подозрение, что это может быть причиной замедлений, но он все еще не объясняет, почему замедление уже заметно в дизайнере.
private void LoadControls(Form form)
{
this.SuspendLayout();
this.DoubleBuffered = true;
EnableDoubleBuffering(this.Controls);
this.BackgroundImage = form.BackgroundImage;
this.BackColor = form.BackColor;
this.Controls.Clear();
foreach (Control c in form.Controls)
{
this.Controls.Add(c);
}
this.ResumeLayout();
}
Как вы можете видеть, SuspendLayout()
и ResumeLayout()
используются, чтобы избежать ненужного перерисовки.
Тем не менее, форма "медленно, как ад", когда используется BackgroundImage. Я даже попытался преобразовать его в PNG, JPG и BMP, чтобы понять, не имеет значения. Кроме того, изображение имеет размер 1024x768, но меньшие изображения имеют тот же эффект замедления (хотя и немного меньше).
Что мне делать?