2010-04-13 3 views
0

У меня есть два окна сообщений один за другим. Dim msgResult в MessageBoxResult msgResult = MessageBox.Show ("Message", "Заголовок", MessageBoxButton.YesNo, MessageBoxImage.Question)WPF обновить после сообщения окно закрыто в vb.net

если mesgResult = MessageBoxresult.Yes Тогда «некоторый код ..... MessageBox .Show («Еще одно сообщение», «Название», MessageBoxButton.OK, MessageBoxImage.Error)

Конец если

Когда второе окно сообщения закрывается пользователю остается в том же окне, а часть из строка заголовка из окна сообщения все еще отображается над текстовым окном Windows. Кажется, что окно не обновилось. Как справиться с этим? Спасибо.

+0

Используйте Debug + Break All и посмотрите на стек вызовов. Выполняется некоторый код, что предотвращает само рисование окна. –

ответ

1

Обычно это не происходит в чистых приложениях WPF. Ситуации, которые я видел, где это происходит, являются:

  1. Вашего поток пользовательского интерфейса выполняют некоторые длительные коду, а не в процессе обработки сообщений
  2. Существует ошибка в драйверах
  3. прозрачности окна в использовании , эта часть окна прозрачна, а приложение, отличное от WPF, отвечает за его покраску
  4. Вы интегрируете WPF с технологиями без WPF, такими как GDI (например, MFC), GDI + (например, WinForms) или DirectX, а также область, имеющая проблемы с окраской, должна быть окрашена другой технологией. Это включает в себя элементы управления Frame и MediaPlayer, которые используют технологии, отличные от WPF, под капотом.

Решение различно:

  • В случае 1 и, как правило, в случае 4 проблемы часто очевидна и решение, как правило, чтобы исправить ваши проблемы многопоточности. Если проблема с потоками не очевидна, взломать отладчик, как предложил Ханс Пассант, может показать долговременную операцию, о которой вы не знали, например доступ к базе данных.
  • В случае 2 вы можете диагностировать его, временно переключившись на рендеринг программного обеспечения и исправить его, обновив видеодрайверы.
  • В случае 3 вы ничего не можете сделать, если другое приложение не будет перерисовывать, но пользователи должны признать, что это не проблема с вашим программным обеспечением.
  • В случае 4, если проблема с потоками не очевидна, обычно полезно изолировать код, отличный от WPF, и посмотреть, какие потоки обработки сообщений активны.

Обратите внимание, что выполнение длительных операций с потоком пользовательского интерфейса, как правило, является плохой идеей, и если вам нужно запускать такие операции, ваше приложение должно быть многопоточным. Однако, если ваше приложение является быстрым и грязным, или вы в порядке, полностью блокируя пользовательский интерфейс, вы можете исправить проблему с краской, убедившись, что очередь диспетчера полностью очищена, прежде чем начинать длительную работу. Это делается путем запуска пустого вызова Dispatcher с низким приоритетом, в результате чего все операции с более высоким приоритетом выполняются первыми. Например:

Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action(() => {})); 
Смежные вопросы