Обновление WPF после закрытия окна сообщения в vb.net - PullRequest
0 голосов
/ 13 апреля 2010

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

if mesgResult = MessageBoxresult.Yes Then 'некоторый код ..... MessageBox.Show («Другое сообщение», «Заголовок», MessageBoxButton.OK, MessageBoxImage.Error)

Конец, если

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

1 Ответ

1 голос
/ 14 апреля 2010

Обычно это не происходит в чистых приложениях 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(() => {}));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...