WPF WebView в диалоговом окне не отображает содержимое с первого раза - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть приложение WPF, работающее на рабочем столе Win10 с использованием нового (Microsoft.Toolkit.Wpf.UI.Controls.WebView v5.0.0.0) WebView элемента управления в диалоговом окне. Первый раз создается это диалоговое окно, WebView навигация завершается успешно, но большую часть времени WebView упорно продолжает показывать пустую страницу.

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

Изменение WebView.Visibility в коде на Collapsed и затем обратно на Visible после завершения навигации не исправляет пустую страницу.

Кто-нибудь видел такое поведение? У кого-нибудь есть решение спровоцировать WebView на фактический рендеринг?

Теоретически новый WebView является лучшим архитектурным вариантом, чем возвращение к старому WebBrowser, поэтому я не хочу идти по этому пути.


Дополнительные детали

  • Рабочий стол Windows 10, x64, таргетинг на .NET 4.6.2, WPF 4.x. Экземпляр WebView определен в XAML (без привязки Source) внутри UserControl.
  • UserControl встроен в окно, определенное в XAML, которое содержит только корневой уровень Grid, содержащий UserControl.
  • Это окно отображается через ShowDialog().
  • Исходная навигация выполняется в коде позади, контролируемом текущим выбором TabControl.
  • WebView НЕ определен в шаблоне элемента TabControl (при этом большая часть времени вызывает исключения при изменении выбора вкладки). Он находится в контейнере, который является родным для TabControl.
  • Событие NavigationCompleted сообщает об успехе.

1 Ответ

0 голосов
/ 17 ноября 2018

Я обнаружил, что попытка свернуть, а затем восстановить содержащее окно в коде не устранило его, несмотря на то, что минимизация и восстановление работали, когда пользователь это делал. Аннулирование макета элемента управления или визуального или аранжировки не сработало. Максимизация и восстановление окна в коде сделали, но визуально раздражает, но это привело меня к двум разумным обходным путям:


Настройте WebView.Visibility на Collapsed в XAML и либо:

  • обрабатывает событие UserControl.Loaded и устанавливает видимость на Visible; или
  • обрабатывает событие WebView.NavigationStarting и устанавливает его в Visible.

Это проще всего, если вначале свернуть не приведет к недопустимому визуальному нарушению. Ранний вход через событие Loaded помогает. Начало Hidden не работает.


Оставьте WebView.Visibility настроенным на Visible в XAML, обработайте событие WebView.NavigationStarted в UserControl, а затем, если обработчик, вызываемый в этом процессе в первый раз, делает что-то подобное, чтобы вызвать изменение размера элемента управления а затем восстановить исходный размер:

var height = Height;
Height = 0;
Application.Current.Dispatcher.BeginInvoke(
    (Action)(() => { Height = height; }), 
    DispatcherPriority.Input
);

По-видимому, требуется отправка восстановления значения (хотя, может быть, достаточно вызвать что-то вроде InvalidateLayout() между ними). ​​

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...