如何避免 Web 浏览器导航功能中的循环
How to Avoid Looping in Webbroser Navigate Function
我正在编写一个使用 WebBrowser 控件的 C# Winforms 程序。在我的程序中,每当我在我的网络浏览器页面中单击 link 时,我都会使用导航功能,这样我就可以创建一些文本并将其分配给
WebBrowser.DocumentText。这很好用。但是,该程序还可以执行一个 WebBrowser.Navigate(url) 函数,该函数创建一个程序循环,因为它不断通过 OnNavigate 函数返回,如下所示:
private void OnNavigate(object sender, WebBrowserNavigatedEventArgs e)
{
string url = e.Url.ToString().Replace("about:", "");
............
}
所以问题是,如果我的程序中有一个 OnNavigate 事件或函数,并且我还执行了一个 WebBrowser.Navigate(url) 函数,程序将继续循环上面显示的 OnNavigate 函数在执行 WebBroswer.Navigate 函数时。如果我从我的程序中删除 OnNavigate 事件,那么 WebBrowser.Navigate(url) 函数将不会循环并显示相应的页面。
有谁知道为什么会这样,或者我如何防止 WebBrowser.Navigate 函数在 OnNavigate 中循环?
当您将 onNavigate 事件设置为处理程序时,您可以说,每当我导航时,运行 这个函数。
我能看到循环发生的唯一原因是您正在事件处理程序中调用另一个导航。因此,请检查事件处理程序或事件处理程序调用的函数中的调用堆栈中是否不存在导航调用。
如果这是问题所在并且处理程序的目的是在导航之前对 url 执行某些操作,则您可能使用了错误的事件并且需要一个 beforeNavigate 事件或一个允许您取消的导航事件导航或修改导航前的url。
无论如何,如果您找不到循环的位置,您可以为整个表单设置一个变量,例如
bool navigating=false;
当您想导航时,您可以:
navigating=true;
webbrowser.navigate(aurl);
navigating=false;
在事件处理程序中,您可以
private void OnNavigate(object sender, WebBrowserNavigatedEventArgs e)
{
if (navigating)
return;
string url = e.Url.ToString().Replace("about:", "");
............
}
我正在编写一个使用 WebBrowser 控件的 C# Winforms 程序。在我的程序中,每当我在我的网络浏览器页面中单击 link 时,我都会使用导航功能,这样我就可以创建一些文本并将其分配给 WebBrowser.DocumentText。这很好用。但是,该程序还可以执行一个 WebBrowser.Navigate(url) 函数,该函数创建一个程序循环,因为它不断通过 OnNavigate 函数返回,如下所示:
private void OnNavigate(object sender, WebBrowserNavigatedEventArgs e)
{
string url = e.Url.ToString().Replace("about:", "");
............
}
所以问题是,如果我的程序中有一个 OnNavigate 事件或函数,并且我还执行了一个 WebBrowser.Navigate(url) 函数,程序将继续循环上面显示的 OnNavigate 函数在执行 WebBroswer.Navigate 函数时。如果我从我的程序中删除 OnNavigate 事件,那么 WebBrowser.Navigate(url) 函数将不会循环并显示相应的页面。
有谁知道为什么会这样,或者我如何防止 WebBrowser.Navigate 函数在 OnNavigate 中循环?
当您将 onNavigate 事件设置为处理程序时,您可以说,每当我导航时,运行 这个函数。
我能看到循环发生的唯一原因是您正在事件处理程序中调用另一个导航。因此,请检查事件处理程序或事件处理程序调用的函数中的调用堆栈中是否不存在导航调用。
如果这是问题所在并且处理程序的目的是在导航之前对 url 执行某些操作,则您可能使用了错误的事件并且需要一个 beforeNavigate 事件或一个允许您取消的导航事件导航或修改导航前的url。
无论如何,如果您找不到循环的位置,您可以为整个表单设置一个变量,例如
bool navigating=false;
当您想导航时,您可以:
navigating=true;
webbrowser.navigate(aurl);
navigating=false;
在事件处理程序中,您可以
private void OnNavigate(object sender, WebBrowserNavigatedEventArgs e)
{
if (navigating)
return;
string url = e.Url.ToString().Replace("about:", "");
............
}