在不使用 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可能是同一线程的子线程,这样我就不必每次都从表单中调用它?如果没有,我怎么能摆脱这个丑陋的调用东西?

在不使用 C# 中调用的情况下访问控件

你可以执行以下操作

  1. 在 JobClass 中定义一个事件,将其称为 OnNavigationChanged
  2. 处理表单1中的事件引发
  3. 在已处理事件方法中,可以调用 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();
}

希望这对你有帮助