2 votes

Effacer l'historique de navigation du WebView dans WinRT Windows Store App C#

Scénario

Je suis en train de créer un simple "navigateur" intégré à mon application, qui s'ouvre dans une fenêtre de type Popup lorsque l'utilisateur clique sur un bouton contenant un lien hypertexte destiné à s'ouvrir "in-app".

La fenêtre contextuelle est ouverte, et la fenêtre (simplement nommée) WebView est dirigé vers l'URL spécifié dans l'hyperlien.

Il y a les boutons classiques de retour, d'avance et de rafraîchissement/arrêt qui sont activés/désactivés en conséquence.


Situation actuelle

J'ai mis en place les événements nécessaires pour NavigationStarted , NavigationCompleted et d'autres pour Falied, Loaded etc. etc.

Ces opérations sont exécutées en même temps qu'un câblage "coquin" du ViewModel lorsque l'option UserControl est chargé TL;DR - il n'y a aucun moyen que je puisse trouver pour respecter la pratique MVVM avec les WebViews, quel PITA ! :

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);
    }
}

Ceci afin que je puisse naviguer vers l'URL lorsque la fonction UserControl est chargé, et peut évaluer l'état des boutons lorsque l'utilisateur navigue en utilisant les événements ci-dessus.

El NavigateToUrl() contient juste un try / catch pour contrer les erreurs éventuelles de formation du 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 Retour/Forward

En particulier, les boutons Précédent et Suivant sont désactivés/activés lorsque la navigation vers une page est lancée/terminée respectivement.

J'évalue leur IsEnabled comme ça :

btnBackButton.IsEnabled = this.WebView.CanGoBack;
btnForwardButton.IsEnabled = this.WebView.CanGoForward;

Cela fonctionne parfaitement pendant toute la durée de la navigation de l'utilisateur.


La question

Si l'utilisateur ferme la fenêtre contextuelle et la rouvre via le même lien ou un lien différent, l'URL correct est affiché - tout va bien.

Le problème est que leur session de navigation précédente n'a jamais été effacée de la base de données. MyWebView et donc le btnBackButton (pas l'avant, car il s'agit de la dernière navigation dans la pile d'historique) est à nouveau activée - ce qui leur permet de parcourir les pages qu'ils ont visitées précédemment.

Je ne veux pas de ce comportement.

J'aimerais qu'il apparaisse que leur session est une "nouvelle", une session fraîche - sans bouton Précédent activé - comme si elle venait d'être ouverte.


Ce que j'ai déjà essayé...

Je ne parviens pas à définir manuellement le MyWebView.CanGoBack / MyWebView.CanGoForward à false lorsque le popup est (ré)ouvert.

Ils sont get -Ce n'est donc pas possible.


J'ai essayé de réinitialiser le WebView lorsque l'élément contenant UserControl es Loaded (dans le même OnLoaded comme ci-dessus) :

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);
        }
    }
}

Dans l'espoir que cela puisse fonctionner - mais la Loaded délégué de la WebView n'est jamais tiré.

Dans l'interface utilisateur, le WebView n'apparaît pas.


A l'aide ! ?

Existe-t-il un moyen pour moi d'effacer l'historique de navigation de l'application WebView Il semble donc que la session de navigation soit une "nouvelle" session ?

Votre aide est appréciée, comme toujours. Merci beaucoup.

2voto

Neal wang - MSFT Points 302

Si votre application est sous Windows 8.1, il n'y a pas de moyen programmatique pour effacer le cache de la vue web selon ce que @Matt a dit dans ce lien (partie 7).

Et si c'est une application UWP, veuillez vous référer à ce document .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X