[WPF] Wait for a moment.

Posted 记忆碎片

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[WPF] Wait for a moment.相关的知识,希望对你有一定的参考价值。

一、控件介绍

    在 WPF 中使用的等待控件,控件包括三种,普通的等待信息提示(WaitTip),进度条提示(WaitProgress),以及主程序覆盖的模拟时钟等待窗口(WaitClock),具体效果看下面的图示。

  • 支持自定义等待信息
  • 支持在异步线程中设置进度或者关闭等待窗口
  • 支持覆盖某个 UIElementCollection,或者覆盖当前主程序或者某个 Window

二、图示效果

WaitControlDemo

三、细节说明

  1. 覆盖某个 UIElementCollection,是在 UIElementCollection 中添加等待控件之后,等待控件的背景面板覆盖住 UIElementCollection,达到用户无法操作 UIElementCollection 的效果,同时又不影响 UIElementCollection 之外的其他控件。
  2. 覆盖主程序或者某个 Window,是将等待控件放置于一个子 Window 中,并设置该子 Window 的如下属性:
    • WindowStyle = WindowStyle.None
    • Background = new SolidColorBrush(Colors.Transparent) (设置背景为透明色,配合下一条使用)
    • AllowsTransparency = true (允许透明色)
    • Owner = parentWindow (设置依附的父窗口)
    • WindowStartupLocation = WindowStartupLocation.CenterOwner (位于父窗口中央)
    • SizeToContent = SizeToContent.WidthAndHeight (保证 Window 跟随内部的内容大小)
    • ShowInTaskbar = false (不在任务栏显示该窗口)
    • Content = this(等待控件)

      最后在异步线程启动之后,调用该子 Window 的 ShowDialog 方法即可。

      需要注意的是,如果在异步线程启动之前,调用了子 Window 的 ShowDialog 方法,则是无法在异步线程中关闭等待控件,即子 Window。如下代码所示:

private void btnWaitTipTest2_Click(object sender, RoutedEventArgs e)
{
    WaitTip waitTip = new WaitTip(this);
    Thread t = new Thread(new ThreadStart((Action)delegate
    {
        try
        {
            for (int i = 0; i <= 5; i++)
            {
                Thread.Sleep(1000);
            }
            waitTip.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }));
    t.Start();
    waitTip.Show("WaitTip Control Test2");
}

      上面代码最后两行,如果互换位置,依旧可以显示等待控件,但是子线程就不会运行,也就不会关闭等待控件了,因为 Window 的 ShowDialog 方法会占住主线程,除非关闭,否则后面的代码无法运行。

  1. WaitProgress 支持设置 IsIndeterminate 属性,即是显示实际值,还是显示一般的连续进度反馈。以及进度到达 100%后是否自动关闭进度条。
  2. WaitClock 主要是通过 Path 绘制时针、分针和秒针,然后在 DispatcherTimer 的 Tick 事件中不断更新三针的角度即可,当然要设置好三针的旋转中心,详细内容可参考代码。
  3. 最后,在异步线程中操作 UI 元素,采用了下面简单的处理:
UI.Dispatcher.BeginInvoke((Action)delegate (){
    // 操作 UI 代码
});

四、资源下载

dll+源工程以及Demo工程下载:http://files.cnblogs.com/files/memento/WaitControl.7z

以上是关于[WPF] Wait for a moment.的主要内容,如果未能解决你的问题,请参考以下文章

Wait for a goroutine

使用 Rollup for Angular 2 的 AoT 编译器并导入 Moment.js

poll--wait for some event on a file descriptor

Ubuntu 20.04 22.04 TLS 开机卡在“A start job is running for wait for network to be Configured”解决

Ubuntu开机卡“A start job is running for wait for network to be Configured”的解决方法

bzoj4690 Never Wait for Weights