【问题标题】:Check if web browser control load on other form检查网络浏览器控件是否加载到其他表单上
【发布时间】:2015-06-29 15:11:52
【问题描述】:

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

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

我不确定如何检查表格是否完成。但是我发现可以使用:

if (browser.ReadyState == WebBrowserReadyState.Complete)

但我不知道如何让表单进行通信。

【问题讨论】:

  • 你到底有什么问题?
  • 如果加载了表单 1 中的 Web 浏览器,我想签入表单 2,关闭表单 2 并显示表单 1 和 Web 浏览器
  • @developerweb 我重写了这个问题(前段时间),它丢失了什么吗?

标签: c# winforms visual-studio


【解决方案1】:

用你的网络浏览器在表单上创建一个公共方法:

    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。但是,如果这只是您正在制作的闪屏解决方案,我会说那将是矫枉过正。

作为轮询 Web 浏览器状态的替代方法,还可以对 Web 浏览器 OnDocumentCompleted 做出反应。这将是一个不同的模式,但请查看 Zombies 的答案以获得一个想法。

【讨论】:

  • 你认为Application.DoEvents() 循环比OnDocumentCompleted 事件更好吗?
  • 并非如此,这只是另一种方式。 DoEvents 大多不受欢迎:),但在我看来使用它是 Main() 还不错。
  • 您认为您可以添加OnDocumentCompleted(或者替换您的Application.DoEvents(),或者将其作为替代项提及)?你的答案比我的好,所以如果你提到OnDocumentCompleted,我可以删除我的答案。
  • 不要删除它。它是针对同一问题的不同解决方案。
  • 但是我需要改进它(我对它并不满意),我最终会得到一个与你的答案太相似的答案。我希望您包含实际代码,并且我会删除我的答案。我认为这是 SO 的最佳解决方案。
【解决方案2】:

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

(代码未经测试,可能不正确,但它应该让您了解可以测试的内容)

可能需要公开,正如 here 建议的那样。

【讨论】:

    【解决方案3】:

    我会说,试试这个。 这不是最好的解决方案,但确实可以。

    • 确保 WebBrowserControl 的成员设置为“public”,这样您就可以从另一个表单访问控件的成员。 (换句话说,该控件将访问修饰符设置为“public”:在https://msdn.microsoft.com/nl-be/library/wxh6fsc7.aspx阅读更多内容)
    • 然后从 form2 新建 form1(或确保 form2 有一个包含对 form1 的引用的变量)。这样您就可以从 form2 操作或查询 form1。

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

    【讨论】:

      猜你喜欢
      • 2017-07-15
      • 2018-04-10
      • 2011-03-19
      • 1970-01-01
      • 2011-11-30
      • 2017-06-02
      • 2013-10-06
      • 2018-05-31
      • 1970-01-01
      相关资源
      最近更新 更多