#c# #webview #windows-store-apps #winrt-xaml
#c# #веб-просмотр #windows-store-приложения #winrt-xaml
Вопрос:
Сценарий
Я создаю простой встроенный «браузер» для своего приложения, который открывается в Popup
, когда пользователь нажимает на кнопку с гиперссылкой, предназначенной для открытия «in-app».
Откроется всплывающее окно, и (с простым именем) WebView
будет осуществлен переход по URL-адресу, указанному в гиперссылке.
Есть типичные кнопки возврата, перемотки вперед и обновления / остановки, которые соответственно включены / отключены.
Текущая ситуация
Я подключил необходимые события для NavigationStarted
, NavigationCompleted
а другие для Falied, Loaded и т. Д. И т. Д.
Они выполняются вместе с некоторой «непослушной» проводкой ViewModel при UserControl
загрузке TL; DR — я не могу найти способа придерживаться практики MVVM с WebViews, что за ЛАВАШ!:
private void OnLoaded(object sender, RoutedEventArgs e)
{
if (this.DataContext is IWebViewUserControlViewModel)
{
this.WebView.ContentLoading = OnWebViewContentLoading;
this.WebView.DOMContentLoaded = OnWebViewDomContentLoaded;
this.WebView.NavigationStarting = OnWebViewNavigationStarting;
this.WebView.NavigationCompleted = OnWebViewNavigationCompleted;
this.WebView.UnviewableContentIdentified = OnWebViewUnviewableContentIdentified;
this.WebView.NavigationFailed = OnWebViewNavigationFailed;
this.viewModel = DataContext as IWebViewUserControlViewModel;
NavigateToUrl(this.viewModel?.Url);
}
}
Это делается для того, чтобы я переходил к URL-адресу при UserControl
загрузке и мог оценивать состояния кнопок, когда пользователь перемещается с помощью событий, описанных выше.
NavigateToUrl()
Метод просто содержит try
/ catch
block для противодействия любым ошибкам, образующим Uri
etc.:
private void NavigateToUrl(string url)
{
try
{
var uri = new Uri(url);
this.WebView.Navigate(uri);
}
catch (Exception ex)
{
this.WebView.NavigateToString($"An error occurred: {ex.Message}")
}
}
UX назад / вперед
В частности, кнопки Назад и Вперед отключаются / включаются при запуске / завершении перехода на страницу соответственно.
Я оцениваю их IsEnabled
состояния следующим образом:
btnBackButton.IsEnabled = this.WebView.CanGoBack;
btnForwardButton.IsEnabled = this.WebView.CanGoForward;
Это работает нормально в течение всего времени просмотра пользователем.
Проблема
Если пользователь закроет всплывающее окно и снова откроет его по той же или другой ссылке, будет указан правильный URL-адрес — все хорошо.
Проблема в том, что их предыдущий сеанс просмотра никогда не удалялся из MyWebView
, и, следовательно btnBackButton
, (не переадресация, поскольку это последняя навигация в стеке истории) теперь снова включена, что позволяет им просматривать ранее посещенные страницы.
Я не хочу такого поведения.
Я бы хотел, чтобы казалось, что их сеанс является «новым», свежим — без включенной кнопки «Назад» — как если бы он только что был открыт.
То, что я уже пробовал…
Я не могу вручную установить MyWebView.CanGoBack
для / MyWebView.CanGoForward
properties значение false при повторном открытии всплывающего окна.
Они get
— всего лишь свойства, так что это невозможно.
Я попытался повторно инициализировать элемент WebView
управления, когда содержащий UserControl
Loaded
(в том же OnLoaded
делегате, что и выше):
private void OnLoaded(object sender, RoutedEventArgs e)
{
if (this.DataContext is IWebViewUserControlViewModel)
{
// Re-initialize the WebView
this.WebView = new WebView();
// Detect when the new control has loaded, and then wire up events/navigate as normal
this.WebView.Loaded = (sender, e) =>
{
this.WebView.ContentLoading = OnWebViewContentLoading;
this.WebView.DOMContentLoaded = OnWebViewDomContentLoaded;
this.WebView.NavigationStarting = OnWebViewNavigationStarting;
this.WebView.NavigationCompleted = OnWebViewNavigationCompleted;
this.WebView.UnviewableContentIdentified = OnWebViewUnviewableContentIdentified;
this.WebView.NavigationFailed = OnWebViewNavigationFailed;
this.viewModel = DataContext as IWebViewUserControlViewModel;
NavigateToUrl(this.viewModel?.Url);
}
}
}
В надежде, что это может сработать, но Loaded
делегат WebView
никогда не запускается.
В пользовательском интерфейсе WebView
просто не отображается.
Помогите!?
Есть ли у меня какой-нибудь способ очистить историю навигации для элемента WebView
управления, чтобы казалось, что сеанс просмотра является «новым»?
Мы, как всегда, ценим вашу помощь. Большое спасибо.
Ответ №1:
Если ваше приложение работает под управлением Windows 8.1, на самом деле нет программного способа очистки кэша WebView в соответствии с тем, что сказал @Matt в этой ссылке (часть 7).
И если это приложение UWP, пожалуйста, обратитесь к этому документу.
Комментарии:
1. Спасибо @Neal за ваше предложение. Проголосовал против. App — это приложение для магазина Windows 8.1. Я быстро просмотрел предоставленную вами ссылку и посмотрю, есть ли способ программно выполнить эту очистку истории, кэша, файлов cookie и т. Д. Просто для дальнейшего использования, поскольку ссылки могут испортиться: возможно ли, чтобы вы включили цитату в свой ответ, если это произойдет; тогда любые будущие посетители этого вопроса смогут увидеть важную часть в случае, если произойдет неизбежное. Очевидно, что по-прежнему рекомендуется указывать ссылку для справки. Еще раз спасибо 🙂