DocumentCompleted
发生时,并不意味着它已经完成导航。我已经搜索了很多并找到了两个伪解决方案:
在
DocumentCompleted
事件中检查 WebBrowser 的 ReadyState 属性。问题在于,如果加载的不是文档而是文档中的一个框架,则即使主文档未完成,ReadyState
也将是Completed
。为了防止这种情况,建议检查传递给
DocumentCompleted
的 Url 参数是否与WebBrowser
的 Url 匹配。这样我就知道DocumentCompleted
不是由文档中的其他框架调用的。
将对
Navigating
的调用次数加起来,减去对 DocumentCompleted
的调用次数不起作用。它们并不总是相同的。我已经几个月没有找到解决这个问题的方法了;我一直在使用解决方案1和2,并希望它们适用于大多数情况。我的计划是在某些网页出现错误或其他情况时使用定时器,但我认为 Google 地图没有任何错误。我仍然可以使用它,但唯一更丑陋的解决方案就是烧毁我的电脑。
编辑: 到目前为止,这是我接近解决方案的最近进展:partial class SafeWebBrowser
{
private class SafeNavigationManager : INotifyPropertyChanged
{
private SafeWebBrowser Parent;
private bool _IsSafeNavigating = false;
private int AccumulatedNavigations = 0;
private bool NavigatingCalled = false;
public event PropertyChangedEventHandler PropertyChanged;
public bool IsSafeNavigating
{
get { return _IsSafeNavigating; }
private set { SetIsSafeNavigating(value); }
}
public SafeNavigationManager(SafeWebBrowser parent)
{
Parent = parent;
}
private void SetIsSafeNavigating(bool value)
{
if (_IsSafeNavigating != value)
{
_IsSafeNavigating = value;
OnPropertyChanged(new PropertyChangedEventArgs("IsSafeNavigating"));
}
}
private void UpdateIsSafeNavigating()
{
IsSafeNavigating = (AccumulatedNavigations != 0) || (NavigatingCalled == true);
}
private bool IsMainFrameCompleted(WebBrowserDocumentCompletedEventArgs e)
{
return Parent.ReadyState == WebBrowserReadyState.Complete && e.Url == Parent.Url;
}
protected void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null) PropertyChanged(this, e);
}
public void OnNavigating(WebBrowserNavigatingEventArgs e)
{
if (!e.Cancel) NavigatingCalled = true;
UpdateIsSafeNavigating();
}
public void OnNavigated(WebBrowserNavigatedEventArgs e)
{
NavigatingCalled = false;
AccumulatedNavigations++;
UpdateIsSafeNavigating();
}
public void OnDocumentCompleted(WebBrowserDocumentCompletedEventArgs e)
{
NavigatingCalled = false;
AccumulatedNavigations--;
if (AccumulatedNavigations < 0) AccumulatedNavigations = 0;
if (IsMainFrameCompleted(e)) AccumulatedNavigations = 0;
UpdateIsSafeNavigating();
}
}
}
SafeWebBrowser
继承 WebBrowser
。方法 OnNavigating
、OnNavigated
和 OnDocumentCompleted
分别在相应的 WebBrowser
重写方法中被调用。属性 IsSafeNavigating
可以让我知道它是否正在导航。