【问题标题】:How to Avoid Looping in Webbroser Navigate Function如何避免 Webbrowser 导航功能中的循环
【发布时间】:2021-06-27 00:14:22
【问题描述】:

我正在编写一个使用 WebBrowser 控件的 C# Winforms 程序。在我的程序中,每当我单击网络浏览器页面中的链接时,我都会使用导航功能,这样我就可以创建一些文本并将其分配给 WebBrowser.DocumentText。这工作正常。但是,该程序也可以执行 WebBrowser.Navigate(url) 函数,该函数创建一个程序循环,因为它通过 OnNavigate 函数不断返回,如下所示:

private void OnNavigate(object sender, WebBrowserNavigatedEventArgs e)
{
    string url = e.Url.ToString().Replace("about:", "");
    ............
}

所以问题是,如果我的程序中有 OnNavigate 事件或函数,并且我还执行了 WebBrowser.Navigate(url) 函数,则在执行 WebBroswer.Navigate 函数时,程序将继续循环通过上面显示的 OnNavigate 函数。如果我从我的程序中删除 OnNavigate 事件,则 WebBrowser.Navigate(url) 函数将不会循环并显示相应的页面。

有谁知道为什么会发生这种情况,或者我可以如何防止 WebBrowser.Navigate 函数循环通过 OnNavigate?

【问题讨论】:

    标签: c# visual-studio-code webbrowser-control


    【解决方案1】:

    当您将 onNavigate 事件设置为处理程序时,您可以说,每当我导航时,运行此函数。

    我可以看到循环发生的唯一原因是您在事件处理程序中调用另一个导航。因此,请检查事件处理程序或事件处理程序调用的函数中的调用堆栈中是否不存在导航调用。

    如果这是问题所在,并且处理程序的目的是在导航之前对 url 做一些事情,那么您可能使用了错误的事件,需要一个 beforeNavigate 事件或一个允许您取消导航或修改 url 的 Navigating 事件导航前。

    无论如何,如果您找不到循环的位置,您可以做的是为整个表单设置一个变量,例如

    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:", "");
      ............
    }
    

    【讨论】:

    • 我试图输入代码,如果我正在导航,它会立即返回,但它仍然保持循环。另外,我在 OnNavigate 事件中有一些 Webbrower.Navigate 指令。我将删除这些说明,然后再试一次,看看是否有什么不同。
    • 我从 OnNavigate 事件中删除了 Webbrowser.Navigate 函数,现在我的导航不再循环了。非常感谢您的建议。
    • 酷。我确实想知道为什么它一开始就在那里。每次导航后它都应该做一些事情。也许这只是将所有这些东西移出 onnavigate 处理程序并将其放在第一次调用 webbrowser1.navigate 的同一个函数中的问题。无论如何,很高兴你明白了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多