【发布时间】:2016-10-13 13:09:04
【问题描述】:
场景
我正在为我的应用程序创建一个简单的嵌入式“浏览器”,当用户单击带有用于打开“应用程序内”的超链接的按钮时,它会在 Popup 中打开。
弹出窗口打开,(简单命名的)WebView 被导航到超链接中指定的 URL。
有典型的后退、前进和刷新/停止按钮可以相应地启用/禁用。
现状
我已经为NavigationStarted、NavigationCompleted 和其他的 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 属性,所以这是不可能的。
当包含UserControl 为Loaded 时(在与上述相同的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);
}
}
}
希望这可能会奏效 - 但 WebView 的 Loaded 代表永远不会被解雇。
在 UI 中,WebView 不会出现。
帮忙!?
我有什么办法可以清除 WebView 控件的导航历史记录,因此浏览会话似乎是一个“新”会话?
一如既往地感谢您的帮助。非常感谢。
【问题讨论】:
标签: c# webview windows-store-apps winrt-xaml