Обновление WPF после закрытия окна сообщения в vb.net

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

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

Конец, если

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


person VanGogh    schedule 13.04.2010    source источник
comment
Используйте Debug + Break All и посмотрите на стек вызовов. Выполняется какой-то код, препятствующий рисованию окна.   -  person Hans Passant    schedule 13.04.2010


Ответы (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 с низким приоритетом, в результате чего все операции с более высоким приоритетом выполняются первыми. Например:

Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action(() => {}));
person Ray Burns    schedule 14.04.2010