gpt4 book ai didi

c# - 清除WinRT Windows Store App C#中WebView的导航历史

转载 作者:行者123 更新时间:2023-11-30 23:19:52 25 4
gpt4 key购买 nike

场景

我正在为我的应用程序创建一个简单的嵌入式“浏览器”,当用户单击带有旨在打开“应用程序内”的超链接的按钮时,它会在 Popup 中打开。

弹出窗口打开,(简单命名的)WebView 导航到超链接中指定的 URL。

有相应启用/禁用的典型后退、前进和刷新/停止按钮。


现状

我已经为 NavigationStartedNavigationCompleted 和其他 Falied、Loaded 等连接了必要的事件。

UserControl 被加载时,这些是与一些“顽皮的”ViewModel 连线一起执行的 TL;DR - 我无法找到保持 WebViews 的 MVVM 实践的方法,多么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);
}
}

这样我就可以在加载 UserControl 时导航到 URL,并且可以在用户使用上述事件四处导航时评估按钮状态。

NavigateToUrl() 方法只包含一个 try/catch block 来抵消形成 Uri 的任何错误等:

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

后退/前进用户体验

特别是当导航到页面开始/完成时分别禁用/启用后退和前进按钮。

我像这样评估它们的 IsEnabled 状态:

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

这在用户浏览的整个过程中都运行良好。


问题

如果用户关闭弹出窗口,然后通过相同或不同的链接重新打开它,则会导航到正确的 URL - 一切正常。

问题是,他们以前的浏览 session 从未从 MyWebView 中清除,因此 btnBackButton(不是前进,因为这是历史上最新的导航stack) 现在再次启用 - 允许他们遍历之前访问过的页面。

我不想要这种行为。

我希望他们的 session 看起来是“新的”,新鲜的 - 没有启用“后退”按钮 - 就好像它刚刚打开一样。


我已经尝试过的...

当(重新)打开弹出窗口时,我无法手动将 MyWebView.CanGoBack/MyWebView.CanGoForward 属性设置为 false。

它们是get-only 属性,所以这是不可能的。


当包含的 UserControlLoaded 时,我尝试重新初始化 WebView 控件(在相同的 OnLoaded 委托(delegate)如上):

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

希望这可能会起作用 - 但 WebViewLoaded 委托(delegate)永远不会被触发。

在 UI 中,WebView 不会出现。


求救!?

有什么方法可以让我清除 WebView 控件的导航历史记录,使浏览 session 看起来是一个"new" session ?

一如既往地感谢您的帮助。非常感谢。

最佳答案

如果您的应用程序是 Windows 8.1,实际上没有根据@Matt 在 this link 中所说的以编程方式清除 webview 缓存。 (第 7 部分)。

如果是UWP应用,请引用this doc .

关于c# - 清除WinRT Windows Store App C#中WebView的导航历史,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40021954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com