zoukankan      html  css  js  c++  java
  • [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

  • 相关阅读:
    FrameLayout和handle实现霓虹灯效果
    Table中collapseColumns,stretchColumns
    自定义View,随着手指运动的小球
    用代码创建视图
    Android scrollbar的设置
    Android安装和设置的方法
    将win7电脑无线网变身WiFi热点,让手机、笔记本共享上网
    同一个ImageView根据xml文件来显示不同的图片--level-list
    android获取屏幕长宽的方法
    Android实现图片裁剪
  • 原文地址:https://www.cnblogs.com/memento/p/6234857.html
Copyright © 2011-2022 走看看