检查web浏览器控件是否加载在其他表单上
本文关键字:其他 表单 加载 是否 web 浏览器 控件 检查 | 更新日期: 2023-09-27 18:00:10
我在Visual Studio中有一个使用WinForms和C#的应用程序。
该应用程序有两个表单,其中一个在启动时可见。启动时,另一个(隐藏的)表单会在WebBrowser组件上启动导航,加载时,它应该隐藏第一个表单,并在浏览器中显示该表单。
我不知道如何检查表格是否完成。然而,我发现一个人可以使用:
if (browser.ReadyState == WebBrowserReadyState.Complete)
但我不知道如何使这些形式交流。
使用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
正如我所说,这不是最优雅的解决方案,但这是目前最快的方法。