在不使用 C# 中调用的情况下访问控件
本文关键字:情况下 访问 控件 调用 | 更新日期: 2023-09-27 18:30:23
我有一个带有 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
可能是同一线程的子线程,这样我就不必每次都从表单中调用它?如果没有,我怎么能摆脱这个丑陋的调用东西?
你可以执行以下操作
- 在 JobClass 中定义一个事件,将其称为 OnNavigationChanged
- 处理表单1中的事件引发
- 在已处理事件方法中,可以调用 WB。导航(网址);
下面是一个示例代码
1- 工作类代表
在 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();
}
希望这对你有帮助