我有一个带有WebBrowser控件的表单,还有一个额外的单独线程来控制浏览器并等待它加载。这是一个代码示例:
private void Form1_Load(object sender, EventArgs e){
JobClass.mainAsync();
}
-
public static class JobClass
{
public static void mainAsync()
{
Thread t = new Thread(main);
t.Start();
}
private static void main()
{
Form1 frm = (Form1)Application.OpenForms["Form1"];
WebBrowser wb = frm.webBrowser1;
gotoGoogle(frm, wb);
}
private static void gotoGoogle(Form1 frm, WebBrowser wb)
{
frm.Invoke((MethodInvoker)delegate
{
wb.Navigate("google.com");
string loc = wb.Document.Url.AbsolutePath;
// ... some extra code ...
});
}
private static void gotoYoutube(Form1 frm, WebBrowser wb)
{
frm.Invoke((MethodInvoker)delegate
{
wb.Navigate("youtube.com");
wb.Document.Body.getElementById("...");
// ... some extra code ...
});
}
}
一切运行正常但是如你所见,我必须将Form1
变量传递给处理浏览器控件的每个方法,我必须在所有这些方法中编写frm.Invoke()
,这使我的随着代码越来越大,代码越来越便携,越来越痛苦。
我想知道在" main()"中是否有我可以做的事情。使WebBrowser
可能是同一个帖子的孩子的方法,所以我不必每次都从表单中调用它?如果没有,我怎么能摆脱这个丑陋的调用呢?
答案 0 :(得分:1)
您可以执行以下操作
这里有一个示例代码
1- JobClass委托
//在JobClass
上方定义此委托public delegate void JobClassNavigationEvent(string url);
2-定义事件
public delegate void JobClassNavigationEvent(string url);
public static class JobClass
{
public static event JobClassNavigationEvent OnNavigationChanged;
private static BackgroundWorker worker;
public static void mainAsync()
{
worker = new BackgroundWorker();
worker.DoWork += (s, e) =>
{
main();
};
worker.RunWorkerAsync();
}
private static void main()
{
gotoGoogle();
}
private static void gotoGoogle()
{
if (OnNavigationChanged != null)
OnNavigationChanged.Invoke("google.com");
}
private static void gotoYoutube()
{
if (OnNavigationChanged != null)
OnNavigationChanged.Invoke("youtube.com");
}
}
表格中的3-
private void Form1_Load(object sender, EventArgs e){
JobClass.OnNavigationChanged+=(url)=>{
webBrowser1.Navigate(url);
// other code come here
};
JobClass.mainAsync();
}
希望这会对你有所帮助