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.