none
关于webbrowser的navigate方法问题 RRS feed

  • 问题

  • 有什么好的办法可以让webbrowser在调用navigate时将程序阻塞,直到webbrowser加载网页完成后再让程序继续往下走吗?
    2012年2月10日 8:33

答案

    • 已标记为答案 wizardhy 2012年2月11日 2:21
    2012年2月10日 12:34
  • Hi wizardhy,

    欢迎来到MSDN论坛!

    您可以参考下面的链接:

    How To Determine When a Page Is Done Loading in WebBrowser Control
    http://support.microsoft.com/kb/q180366/ 

    在All-In-One Code Framework 中有一个关于WebBrowserLoadComplete 的实例,您可以下载All-In-One Code 后查找该示例:http://1codechs.codeplex.com/releases/view/76176 

    抱歉,我没有能找到该示例的直接链接。

    它的摘要如下:

    这个实例演示了如何确定页面在 WebBrowser 控件中完成加载. 

    在页面没有嵌套框架的情况下,DocumentComplete 事件在所有事情完成后,会被引发一次.
    当页面有多个嵌套框架时, DocumentComplete 事件会被多次引发. 

    要检查一个页面是否已经加载完全,你需要检查是否事件的发送次数与WebBrowser控件的相同.

    注意:
    1. 在内嵌框架集的一个内嵌框架中,如果用户单击一个链接,该链接在其自身的页面中打开
       一个新页,并保持内嵌框架集的其余部分保持不变,WebBrowser 控件的 LoadCompleted 
       事件将不会被激发,你需要检查该特定内嵌框架的 DocumentComplete 事件.

    2. 如果你访问一些页面,例如 http://www.microsoft.com, 你可能发现,LoadCompleted 事
       件不是最后的事件.这是因为,在页面加载完成后,该页面可能自己加载其他链接.

    它提供了下面的类:

     DWebBrowserEvents2Helper 类实现了 DWebBrowserEvents2 接口来检查是否完成页面加载.
       
       如果 WebBrowser 控件装载一个普通的、无内嵌框架的 HTML 页面, 在所有事情完成之后,
       DocumentComplete 事件会被引发一次.
       
       如果 WebBrowser 控件装载了许多内嵌框架, DocumentComplete 会被多次引发.
       DocumentComplete 事件有一个 pDisp 参数,它是框架( shdocvw )的 IDispatch.该框架中
       DocumentComplete 被引发. 
       
       然后我们可以检查是否 DocumentComplete 的 pDisp 参数与浏览器的 ActiveXInstance 相同. 

                private class DWebBrowserEvents2Helper : StandardOleMarshalObject, DWebBrowserEvents2
                {
                    private WebBrowserEx parent;

                    public DWebBrowserEvents2Helper(WebBrowserEx parent)
                    {
                        this.parent = parent;
                    }
                
                    public void DocumentComplete(object pDisp, ref object URL)
                    {
                        string url = URL as string;
                   
                        if (string.IsNullOrEmpty(url)
                            || url.Equals("about:blank", StringComparison.OrdinalIgnoreCase))
                        {
                            return;
                        }
                   
                        if (pDisp != null && pDisp.Equals(parent.ActiveXInstance))
                        {
                            var e = new WebBrowserDocumentCompletedEventArgs(new Uri(url)); 
                   
                            parent.OnLoadCompleted(e);
                        }
                    }
                   
                    public void BeforeNavigate2(object pDisp, ref object URL, ref object flags,
                        ref object targetFrameName, ref object postData, ref object headers,
                        ref bool cancel)
                    {
                        string url = URL as string;
                   
                        if (string.IsNullOrEmpty(url)
                            || url.Equals("about:blank", StringComparison.OrdinalIgnoreCase))
                        {
                            return;
                        }
                   
                        if (pDisp != null && pDisp.Equals(parent.ActiveXInstance))
                        {
                            WebBrowserNavigatingEventArgs e = new WebBrowserNavigatingEventArgs(
                                new Uri(url), targetFrameName as string);
                   
                            parent.OnStartNavigating(e);
                        }
                    }
                }

    祝,顺利!

    yoyo


    Yoyo Jiang[MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 wizardhy 2012年2月14日 9:01
    2012年2月14日 5:28
    版主

全部回复

  • 您好,您可以在WebBrowser.DocumentCompleted 事件中再執行哦

    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年2月10日 9:49
    • 已标记为答案 wizardhy 2012年2月11日 2:21
    2012年2月10日 12:34
  • 太感谢了,之前我用过类似的方法进入了死循环,用你这个居然行了,问题解决了
    2012年2月11日 2:21
  • Hi wizardhy,

    欢迎来到MSDN论坛!

    您可以参考下面的链接:

    How To Determine When a Page Is Done Loading in WebBrowser Control
    http://support.microsoft.com/kb/q180366/ 

    在All-In-One Code Framework 中有一个关于WebBrowserLoadComplete 的实例,您可以下载All-In-One Code 后查找该示例:http://1codechs.codeplex.com/releases/view/76176 

    抱歉,我没有能找到该示例的直接链接。

    它的摘要如下:

    这个实例演示了如何确定页面在 WebBrowser 控件中完成加载. 

    在页面没有嵌套框架的情况下,DocumentComplete 事件在所有事情完成后,会被引发一次.
    当页面有多个嵌套框架时, DocumentComplete 事件会被多次引发. 

    要检查一个页面是否已经加载完全,你需要检查是否事件的发送次数与WebBrowser控件的相同.

    注意:
    1. 在内嵌框架集的一个内嵌框架中,如果用户单击一个链接,该链接在其自身的页面中打开
       一个新页,并保持内嵌框架集的其余部分保持不变,WebBrowser 控件的 LoadCompleted 
       事件将不会被激发,你需要检查该特定内嵌框架的 DocumentComplete 事件.

    2. 如果你访问一些页面,例如 http://www.microsoft.com, 你可能发现,LoadCompleted 事
       件不是最后的事件.这是因为,在页面加载完成后,该页面可能自己加载其他链接.

    它提供了下面的类:

     DWebBrowserEvents2Helper 类实现了 DWebBrowserEvents2 接口来检查是否完成页面加载.
       
       如果 WebBrowser 控件装载一个普通的、无内嵌框架的 HTML 页面, 在所有事情完成之后,
       DocumentComplete 事件会被引发一次.
       
       如果 WebBrowser 控件装载了许多内嵌框架, DocumentComplete 会被多次引发.
       DocumentComplete 事件有一个 pDisp 参数,它是框架( shdocvw )的 IDispatch.该框架中
       DocumentComplete 被引发. 
       
       然后我们可以检查是否 DocumentComplete 的 pDisp 参数与浏览器的 ActiveXInstance 相同. 

                private class DWebBrowserEvents2Helper : StandardOleMarshalObject, DWebBrowserEvents2
                {
                    private WebBrowserEx parent;

                    public DWebBrowserEvents2Helper(WebBrowserEx parent)
                    {
                        this.parent = parent;
                    }
                
                    public void DocumentComplete(object pDisp, ref object URL)
                    {
                        string url = URL as string;
                   
                        if (string.IsNullOrEmpty(url)
                            || url.Equals("about:blank", StringComparison.OrdinalIgnoreCase))
                        {
                            return;
                        }
                   
                        if (pDisp != null && pDisp.Equals(parent.ActiveXInstance))
                        {
                            var e = new WebBrowserDocumentCompletedEventArgs(new Uri(url)); 
                   
                            parent.OnLoadCompleted(e);
                        }
                    }
                   
                    public void BeforeNavigate2(object pDisp, ref object URL, ref object flags,
                        ref object targetFrameName, ref object postData, ref object headers,
                        ref bool cancel)
                    {
                        string url = URL as string;
                   
                        if (string.IsNullOrEmpty(url)
                            || url.Equals("about:blank", StringComparison.OrdinalIgnoreCase))
                        {
                            return;
                        }
                   
                        if (pDisp != null && pDisp.Equals(parent.ActiveXInstance))
                        {
                            WebBrowserNavigatingEventArgs e = new WebBrowserNavigatingEventArgs(
                                new Uri(url), targetFrameName as string);
                   
                            parent.OnStartNavigating(e);
                        }
                    }
                }

    祝,顺利!

    yoyo


    Yoyo Jiang[MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 wizardhy 2012年2月14日 9:01
    2012年2月14日 5:28
    版主