检查web浏览器控件是否加载在其他表单上

本文关键字:其他 表单 加载 是否 web 浏览器 控件 检查 | 更新日期: 2023-09-27 18:00:10

我在Visual Studio中有一个使用WinForms和C#的应用程序。

该应用程序有两个表单,其中一个在启动时可见。启动时,另一个(隐藏的)表单会在WebBrowser组件上启动导航,加载时,它应该隐藏第一个表单,并在浏览器中显示该表单。

我不知道如何检查表格是否完成。然而,我发现一个人可以使用:

if (browser.ReadyState == WebBrowserReadyState.Complete)

但我不知道如何使这些形式交流。

检查web浏览器控件是否加载在其他表单上

使用web浏览器在表单上创建一个公共方法:

    public bool IsWebBrowserReady
    {
        get { return browser.ReadyState == WebBrowserReadyState.Complete; }    
    }

然后在你的Main中出现这样的内容:

    private static void Main(string[] args)
{
    //Initialize forms
    var browserForm = new Form1();
    var startForm = new StartForm();
    //Show first form
    startForm.Show();
    //Make sure second form is not visible
    browserForm.WindowState=FormWindowState.Minimized;
    browserForm.ShowInTaskbar = false;
    //"Show" second form
    browserForm.Show();
    //Wait for it to be ready
    while (!browserForm.IsWebBrowserReady) Application.DoEvents();
    //Hide first form
    startForm.Hide();
    //Show second form
    browserForm.ShowInTaskbar = true;
    browserForm.WindowState = FormWindowState.Normal;
    Application.Run();
}

或者,你可以通过将第二个表单的引用传递到StartForm中,将其中的一些逻辑移动到StartForm。然后,你可以从第一个表单访问IsWebBrowserReady。但如果这只是你正在制作的一个splashscreen解决方案,我会说这太过分了。

作为轮询web浏览器状态的替代方案,还可以对web浏览器OnDocumentCompleted做出反应。这将是一个不同的模式,但看看僵尸的答案就会有一个想法。

WebBrowser有一个很好的小事件,叫做OnDocumentCompleted,你可以监听它。它在加载页面时触发。

Form form2 = new Form2();
form2.webBrowser1.OnDocumentCompleted += (e, sender) =>
{
  if (form2.webBrowser1.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete) // each frame trigger the event (?), make sure all is done
  {
    form2.show();
    hide();
  }
};
form2.webBrowser.Navigate("{url}");

(代码没有经过测试,可能不正确,但它应该会给你提供关于你可以测试什么的想法)

正如这里所建议的,可能需要公开。

我想试试这个。这不是最好的解决方案,但它确实起到了作用。

  • 确保WebBrowserControl的成员设置为"public",这样您就可以从另一个窗体访问该控件的成员https://msdn.microsoft.com/nl-be/library/wxh6fsc7.aspx)
  • 然后从form2向上新建form1(或者确保form2有一个包含对form1引用的变量)。通过这种方式,您将能够从form2操作或查询form1

正如我所说,这不是最优雅的解决方案,但这是目前最快的方法。