我正在创建一个简单的嵌入式浏览器"对于我的应用程序,当用户点击一个带有超链接的按钮时,该应用程序会在Popup
中打开,该超链接旨在打开"应用程序内"。
弹出窗口打开,(简单命名的)WebView
导航到超链接中指定的URL。
相应地启用/禁用典型的后退,前进和刷新/停止按钮。
我已经为NavigationStarted
,NavigationCompleted
和其他人为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}")
}
}
特别是当分别开始/完成对页面的导航时,禁用/启用后退和前进按钮。
我评估他们的IsEnabled
州是这样的:
btnBackButton.IsEnabled = this.WebView.CanGoBack;
btnForwardButton.IsEnabled = this.WebView.CanGoForward;
这在用户浏览的整个时间内都能正常工作。
如果用户关闭弹出窗口,并通过相同或不同的链接重新打开它,那么正确的URL将导航到 - 一切正常。
问题是,他们之前的浏览会话从未从MyWebView
中清除,因此btnBackButton
(不是前进,因为这是历史堆栈中的最新导航)现在再次启用 - 允许他们遍历以前访问过的页面。
我不想要这种行为。
我希望看起来他们的会话是新的",新的 - 没有启用“后退”按钮 - 好像它刚刚打开一样。
当(重新)打开弹出窗口时,我无法手动将MyWebView.CanGoBack
/ MyWebView.CanGoForward
属性设置为false。
它们是get
- 仅属性,所以这是不可能的。
当包含WebView
为UserControl
时,我已尝试重新初始化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"一个?
我们一如既往地感谢您的帮助。非常感谢。