项目上线测试时客户提出表单跳转到指定位置(表单比较长)。当时以为这个就是添加几行代码几分钟的事情,随口答应了。但是到做的时候才发现事情远没有那么简单,测试发现将焦点给指定位置的控件表单可自动滑动到指定位置,但是在事件里面调用控件的Focus方法始终没有任何效果。遂觉得是否控件未初始话无法设置Focus所致,新开一个独立线程等待表单初始化完成时进行跳转。但是又发现“线程间操作无效”,原来是由于Windows安全策略新线程无法操作UI主线程,网上终于找到跨线程操作的示例。依葫芦画瓢,通过跨线程调用,问题终于得到解决。没想到弄这么复杂,本来想很简单的解决问题,如果大家有更简洁的实现方式,欢迎讨论分享。

 

Step 1:声明委托

 

private delegate void ScrollFormByFocus();

 

 

Step 2:异步代理

 

    #region ThreadFunction
    private void ThreadFunction()
    {
        if((this[txtSendPubOpinion] as TextBox).InvokeRequired)//等待异步
        {
            ScrollFormByFocus scrollFormByFocus=new ScrollFormByFocus(ThreadFunction);
            this.ContainerForm.Invoke(scrollFormByFocus);//通过代理调用刷新方法
        }
        else
        {
            (this[txtSendPubOpinion] as TextBox).Focus();
        }
    }
    #endregion

 

 

Step 3:调用异步代理

   
    #region CrossThreadFocus
    private void CrossThreadFocus()
    {
        Thread.Sleep(1000);
        try
        {
            ThreadFunction();
        }
        catch(Exception ex)
        {
            logger.Error("分发表单Scrolling遇到问题",ex);
        }
    }
    #endregion

 

 

Step 4:开启线程

 

    #region 分发跳转
    private void FormJump()
    {
        Thread thread = new Thread(CrossThreadFocus);
        thread.IsBackground = true;
        thread.Name="FormJump";
        thread.Start();
    }
    #endregion

 

参考了:http://blog.csdn.net/henreash/article/details/7789566,在此深表谢意。谢谢分享