我在放置在应用程序第二页上的 Web 浏览器控件中使用导航事件。似乎前进和后退的导航事件工作正常。但是,我执行某些操作,例如在我的 Navigated 事件处理程序中维护在我的导航事件中使用的当前浏览器 url 堆栈,根据某些情况,当页面导航到时并不总是注册。维护当前浏览器 url 堆栈的目的是确保如果主页(这是我加载的应用程序的第二页后导航到的第一个页面)使用后堆栈导航到,应用程序应该返回到Microsoft 要求所述的应用程序的第一页。
根据我的调试,如果我使用以下 Web 浏览器控件导航方案,我不会单步执行 Navigated 事件(如下所示)
MainPage > SecondPage with browser( Homepage > Forward > Forward > Back > Forward > Back (导航事件不发生) )
这似乎令人困惑,但本质上,一旦浏览器被导航回来(一次或用户想要的多次),然后继续向前导航,下次用户希望导航到前一页时,导航事件就不会发生即使页面被导航回。
为了显示
//should always pass through this event when ANY navigation occurs
void TheWebBrowser_Navigated(object sender,
System.Windows.Navigation.NavigationEventArgs e)
{
//If we are Navigating Backward and we Can Navigate back,
//remove the last uri from the stack.
if (_IsNavigatingBackward == true && CanNavigateBack)
{
_NavigatingUrls.Pop();
}
//Else we are navigating forward so we need to add the uri
//to the stack.
else
{
_NavigatingUrls.Push(e.Uri);
//If we do not have the navigated uri in our history
//we add it.
if (!_History.Contains(e.Uri.ToString()))
_History.Add(e.Uri.ToString());
}
//If there is one address left you can't go back.
if (_NavigatingUrls.Count > 1)
CanNavigateBack = true;
else
CanNavigateBack = false;
//Finally we hide the progress bar.
ShowProgress = false;
_IsNavigatingBackward = false; //to eliminate staying as true when navigating forward and forward btn not pressed
}
public void NavigateForward()
{
_IsNavigatingBackward = false;
TheWebBrowser.InvokeScript("eval", "history.go(1)");
//_IsNavigating = true;
}
public void NavigateBack()
{
_IsNavigatingBackward = true;
TheWebBrowser.InvokeScript("eval", "history.go(-1)");
}
protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
if (CanNavigateBack)
{
e.Cancel = true;
NavigateBack();
}
else
base.OnBackKeyPress(e);
}
未发生 Navigated 事件的问题会抛出 NavigatingUrls 的计数,因此 CanNavigateBack 标志在主页上保持为真(当用户尝试再次通过返回堆栈导航到 MainPage 时)实际上应该为假,并且我的应用程序的 MainPage 永远无法导航到。