【问题标题】:Clear the navigation history of WebView in WinRT Windows Store App C#清除WinRT Windows Store App C#中WebView的导航历史
【发布时间】:2016-10-13 13:09:04
【问题描述】:

场景

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

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

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


现状

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

这些是在加载 UserControl 时与一些“顽皮”的 ViewModel 接线一起执行的>:

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

后退/前进用户体验

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

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

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

这在用户浏览的整个过程中都能正常工作。


问题

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

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

我不想要这种行为。

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


我已经尝试过的...

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

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


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

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 代表永远不会被解雇。

在 UI 中,WebView 不会出现。


帮忙!?

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 感谢@Neal 的建议。赞成。应用程序是 Windows 8.1 应用商店应用程序。我快速浏览了您提供的链接,我会看看是否有一种方法可以以编程方式清除历史记录、缓存、Cookie 等。仅供将来参考,因为链接可能会变坏:是吗如果确实如此,您可能可以在答案中包含报价;那么这个问题的任何未来访问者都将能够看到重要的部分,以防不可避免的情况发生。显然,仍然建议包含参考链接。再次感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多