WPF-提示窗(线程)

WPF-提示窗(线程)

再次开始写博客小开头~

线程的提示窗自我感觉还可以,不过看过好多大牛说线程慎用,好像是线程释放的问题,不过如果就一个线程,应该问题不大,如果有对线程深入理解的大牛可解释一二~

开始今日随笔~

首先,新建一个新的窗体RemindWinView,简单加入一个TextBlock,Text=“提示窗 1 号”,主窗体的cs文件里定义线程,并初始化线程,代码如下

 1  #region 线程
 2 
 3         //线程状态
 4         private bool flag;
 5         //定义线程
 6         private Thread TRemind;
 7         //事件
 8         private delegate void ThreadGo();
 9         //是否登录及时提醒(true,初始提醒;false,初始10秒后提醒);
10         private bool IsRemindInTime = true;
11 
12         #endregion
13 
14         public MainWindow()
15         {
16             InitializeComponent();
17 
18             //启动线程
19             flag = true;
20             //初始化线程
21             TRemind = new Thread(new ThreadStart(threadProc));
22             //线程运行级别
23             TRemind.Priority = ThreadPriority.Highest;
24             //线程启动前设置单元状态
25             TRemind.SetApartmentState(ApartmentState.STA);
26             //运行线程
27             TRemind.Start();
28         }

定义线程事件

 1  /// <summary>
 2         /// 线程事件
 3         /// </summary>
 4         private void threadProc()
 5         {
 6             while(flag)
 7             {
 8                 if (IsRemindInTime)
 9                 {
10                     System.Windows.Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new ThreadGo(ThreadToGo));
11                     //立即提醒,每十秒提醒
12                     int milSeconds = Convert.ToInt32(10) * 1000;
13                     Thread.Sleep(milSeconds);
14                 }
15                 else
16                 {
17                     //十秒后开始提醒,每10秒一次
18                     int milSeconds = Convert.ToInt32(10) * 1000;
19                     Thread.Sleep(milSeconds);
20                     System.Windows.Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new ThreadGo(ThreadToGo));
21                 }
22             }
23         }

执行事件

 1 /// <summary>
 2         /// 执行事件
 3         /// </summary>
 4         private void ThreadToGo()
 5         {
 6             if (!IsExistShowView("RemindWinView_name"))
 7             {
 8                 RemindWinView w = new RemindWinView();
 9                 w.Left = System.Windows.SystemParameters.PrimaryScreenWidth - w.Width;
10                 w.Top = System.Windows.SystemParameters.WorkArea.Height - w.Height;
11                 w.Show();
12             }
13         }

关闭主窗体后对线程一个释放的事件

 1  /// <summary>
 2         /// 主窗体关闭事件
 3         /// </summary>
 4         /// <param name="sender"></param>
 5         /// <param name="e"></param>
 6         private void Window_Closed(object sender, EventArgs e)
 7         {
 8             //主窗体关闭后,线程停止,否则线程一直在运行
 9             TRemind.Abort();
10         }

还有一个判断,判断提示窗是否存在

 1  /// <summary>
 2         /// 检查窗体是否存在
 3         /// </summary>
 4         /// <param name="winName"></param>
 5         /// <returns></returns>
 6         private bool IsExistShowView(string winName)
 7         {
 8             bool isExist = false;
 9 
10             foreach (Window win in Application.Current.Windows)
11             {
12                 if (win.Name == winName)
13                 {
14                     isExist = true;
15                     win.Activate();
16                     break;
17                 }
18             }
19             return isExist;
20         }

我记得WPF还有一个提示窗,暂时下忘记了,如果想起来的话,再加上吧~

原文地址:https://www.cnblogs.com/shadow-fei/p/4596313.html