不使用C#中的Invoke访问控件

时间:2014-11-13 08:56:07

标签: c#

我有一个带有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可能是同一个帖子的孩子的方法,所以我不必每次都从表单中调用它?如果没有,我怎么能摆脱这个丑陋的调用呢?

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作

  1. 在JobClass中定义一个事件,将其命名为OnNavigationChanged
  2. 处理Form1中的事件加注
  3. 在处理事件方法中,您可以调用wb.Navigate(url);
  4. 这里有一个示例代码

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

    希望这会对你有所帮助