Очистить историю навигации WebView в приложении WinRT Windows Store на C#

#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 и т. Д. Просто для дальнейшего использования, поскольку ссылки могут испортиться: возможно ли, чтобы вы включили цитату в свой ответ, если это произойдет; тогда любые будущие посетители этого вопроса смогут увидеть важную часть в случае, если произойдет неизбежное. Очевидно, что по-прежнему рекомендуется указывать ссылку для справки. Еще раз спасибо 🙂