Обновить форму, пока она скрыта, когда включена Композиция рабочего стола - PullRequest
3 голосов
/ 05 декабря 2011

Я пытаюсь изменить внешний вид моей формы, когда она скрыта.А затем сделайте его видимым.

private void HideLabelAndShowForm()
{
    label1.Hide();
    Invalidate(true);
    Update();
    // thinking we now have no label on the form?
    Show();
    // no! the label is still visible!
    // and gets hidden after a moment
}

Почему форма перерисовывается только после того, как предыдущее содержимое (с видимой меткой) отображается на мгновение?Любой обходной путь?

Обновление

  1. Это происходит только при включенной компоновке рабочего стола (я использую Windows 7).
  2. Удаление Invalidate и Update не помогает
  3. Метод вызывается из потока пользовательского интерфейса
  4. Добавление Thread.Sleep и Application.DoEvents везде не помогает
  5. Calling Showпосле задержки из отдельного потока (с помощью Invoke) не помогает

Ответы [ 4 ]

0 голосов
/ 09 декабря 2011
myForm.Opacity = 0.0F;
myForm.Show();
myForm.Opacity = 1.0F;
0 голосов
/ 05 декабря 2011

Если вас беспокоит мерцание старого контента, попробуйте включить двойную буферизацию.

Поместите эту строку в конструктор формы:

this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);
0 голосов
/ 06 декабря 2011

Событие Paint формы не вызывается, пока форма скрыта. Это не будет рисовать, пока вы не покажите () его снова. Обычно это должно быть так быстро, что вы этого не видите. Я думаю, вы просто видите задержку в окнах. Ваш компьютер может быть недостаточно мощным для композиции на рабочем столе.

Другие мысли:

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

Что попробовать:

  • Убедитесь, что процессор простаивает. Ищите жадные темы / процессы.
  • Проверьте, не вызывает ли ваша форма обработки миллиардов сообщений.
  • Упростите форму, если она имеет много элементов управления.
  • Обновление графического драйвера.
  • Получите более быстрый компьютер.
0 голосов
/ 05 декабря 2011

Попробуйте использовать Application.DoEvents, но будьте осторожны :

private void HideLabelAndShowForm() {
    label1.Hide();
    Application.DoEvents();
    Show();
}
...