在WinRT Windows应用商店中清除WebView的导航历史记录C#

时间:2016-10-13 13:09:05

标签: c# webview windows-store-apps winrt-xaml

方案

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

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

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

现状

我已经为NavigationStartedNavigationCompleted和其他人为Falied,Loaded等设置了必要的活动等。

这些与一些顽皮的"一起进行。加载UserControl时的ViewModel接线 TL; DR - 我无法通过WebView找到保持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块,以抵消构成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}")
    }
}

后退/前进UX

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

我评估他们的IsEnabled州是这样的:

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

这在用户浏览的整个时间内都能正常工作。

问题

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

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

我不想要这种行为。

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

我已经尝试过......

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

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

当包含WebViewUserControl时,我已尝试重新初始化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的{​​{1}}代表永远不会被解雇。

在用户界面中,WebView似乎没有出现。

帮助!?

我有什么方法可以清除WebView控件的导航历史记录,因此浏览会话似乎是" new"一个?

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

1 个答案:

答案 0 :(得分:2)

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

如果是UWP应用,请参阅this doc