一般来说子线程都是用来处理数据的,主窗体用来实现展现,但是有些时候我们希望子窗体实现等待效果,遮挡主窗体并使主窗体逻辑正常进行,这个业务需求虽然不多,但是正好我们用到了,于是我打算把研究成果写在这了。稍后我会上传我的代码,包含测试程序以及之前两边博文谈到的控件,这里我还实现了一个类似雷达扫描的等待窗体,大家可以稍后查看。

  实际上这里只有两个难点需要处理,一个就是如何让子窗体遮挡主窗体并位于主窗体中间,另一个就是委托及跨线程访问UI界面。为了方便调用,我在这里写了一个静态的子线程窗体管理类DialogWindowsManager。

1.遮挡主窗体

  大家都知道,showDialog方法就是最好的遮挡效果,但是由于它是线程阻塞的,因此每当我们想到这里的时候会有一个误区,认为调用showDialog一定会阻塞前台界面,其实这里的阻塞只是阻塞调用方法所在的线程,并不是一定会阻塞主线程,因此在子线程中调用showDialog方法即可达到效果。实际测试时发现遮挡效果确实有了,可惜每次showDialog的时候窗体会满屏幕乱飞,好吧,最好的方法当然是设置onwer,不过我一直没尝试成功,因为主窗体与子窗体一直处于两个线程中,最后我通过一个算法将位置计算出来之后赋值给了子窗体。代码如下:

 1 /// <summary>
 2         /// 打开等待窗体线程
 3         /// </summary>
 4         public static void ShowWaitingForm(Window onwer) {
 5             double[] d = new double[2];
 6             d[0] = onwer.Top + onwer.Height / 2 - 50;
 7             d[1] = onwer.Left + onwer.Width / 2 - 50;
 8             if (WaitingFormThread == null)
 9             {
10                 WaitingFormThread = new Thread(new ParameterizedThreadStart(showWaitingForm));
11                 WaitingFormThread.SetApartmentState(ApartmentState.STA);
12                 WaitingFormThread.Start(d);
13             }
14             else {
15                 CloseWaitingForm();
16                 ShowWaitingForm(onwer);
17             }
18         }
View Code

相关文章: