项目上线测试时客户提出表单跳转到指定位置(表单比较长)。当时以为这个就是添加几行代码几分钟的事情,随口答应了。但是到做的时候才发现事情远没有那么简单,测试发现将焦点给指定位置的控件表单可自动滑动到指定位置,但是在事件里面调用控件的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,在此深表谢意。谢谢分享