仿vs实现WPF好看的进度条

 更新时间:2015年06月09日 12:03:04   投稿:hebedich  
由于WPF自带的进度条其实不怎么好看,而且没啥视觉效果。下面给大家分享的是仿VS的进度条效果的代码,有需要的小伙伴可以参考下。

为了界面友好,一般的操作时间较长时,都需要增加进度条提示。由于WPF自带的进度条其实不怎么好看,而且没啥视觉效果。后来,装VS2012时,发现安装过程中进度条效果不错,于是上网查了资料。学习了ModernUI(开源的),地址:https://github.com/firstfloorsoftware/mui

  后来,做了尝试写了个Demo,效果不错。另外,专门录制了tif文件,方便大家看到效果。废话不多说,先展示效果:

一、效果展示

  A、VS2012安装界面图;

  B、个人尝试Demo效果图: 

二、实现说明

  1、下载MUI相关代码或者dll文件;

  2、工程中引入该dll,并引入其资源文件;

复制代码 代码如下:

<Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/FirstFloor.ModernUI;component/Assets/ModernUI.xaml" />
                <ResourceDictionary Source="/FirstFloor.ModernUI;component/Assets/ModernUI.Light.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

  3、在需要显示进度条的页面,加入控件(其实还是WPF控件,只是MUI扩展了其样式而已);

复制代码 代码如下:

<Label Margin="280,169,0,0" Style="{StaticResource BackGroundContentText}" x:Name="lblMainState" HorizontalAlignment="Left" VerticalAlignment="Top">正在启动:</Label>
        <ProgressBar Margin="280,200,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Minimum="0" x:Name="ProgressControlRealValue" Maximum="1"  Value="0.1" Height="16" IsIndeterminate="False"/>
        <Label Margin="280,212,0,0" Style="{StaticResource BackGroundContentText}" x:Name="lblProcess" HorizontalAlignment="Left" VerticalAlignment="Top">正在加载地图数据...</Label>
        <ProgressBar Margin="280,250,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"  Minimum="0" x:Name="ProgressControl"  Width="500" Maximum="2" Height="16" IsIndeterminate="True" />

  4、后台实现,由于要根据情况更新进度文字及进度条的值。所以,这里用到了异步BackgroundWorker(具体可以网上查查相关资料);

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace Monitor.Class
{
  /// <summary>
  /// 异步操作
  /// </summary>
  public class CWorker
  {
    /// <summary>
    /// 对象
    /// </summary>
    private BackgroundWorker backgroundWorker;

    /// <summary>
    /// 后台执行的操作
    /// </summary>
    public Action BackgroundWork { get; set; }

    /// <summary>
    /// 后台任务执行完毕后事件
    /// </summary>
    public event EventHandler<BackgroundWorkerEventArgs> BackgroundWorkerCompleted;

    private BackgroundWorkerEventArgs _eventArgs;//异常参数

    /// <summary>
    /// 构造
    /// </summary>
    public CWorker()
    {
      _eventArgs = new BackgroundWorkerEventArgs();
      backgroundWorker = new BackgroundWorker();
      backgroundWorker.WorkerReportsProgress = true;
      backgroundWorker.WorkerSupportsCancellation = true;
      backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
      backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
    }

    /// <summary>
    /// 开始工作
    /// </summary>
    public void BegionWork()
    {
      if (backgroundWorker.IsBusy)
        return;
      backgroundWorker.RunWorkerAsync();
    }

    /// <summary>
    /// 工作
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
      if (BackgroundWork != null)
      {
        try
        {
          BackgroundWork();
        }
        catch (Exception ex)
        {
          _eventArgs.BackGroundException = ex;
        }
      }
    }

    /// <summary>
    /// 完成
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
      if (this.BackgroundWorkerCompleted != null)
      {
        this.BackgroundWorkerCompleted(null, _eventArgs);
      }
    }
  }

  /// <summary>
  /// 事件
  /// </summary>
  public class BackgroundWorkerEventArgs : EventArgs
  {
    /// <summary>
    /// 后台程序运行时抛出的异常
    /// </summary>
    public Exception BackGroundException { get; set; }
  }
}

namespace Monitor
{
  /// <summary>
  /// Splash.xaml 的交互逻辑
  /// </summary>
  public partial class Splash : Window
  {
    MainWindow m_MainWindow = null;//主窗口
    CWorker m_Work = null;//任务

    public Splash()
    {
      InitializeComponent();
      m_MainWindow = new MainWindow();//创建主窗口对象
      m_Work = new CWorker();
      m_Work.BackgroundWork = this.ProcessDo;
      m_Work.BackgroundWorkerCompleted += new EventHandler<BackgroundWorkerEventArgs>(m_Work_BackgroundWorkerCompleted);
    }

    /// <summary>
    /// 进度提示
    /// </summary>
    public void ProcessDo()
    {
      m_MainWindow.InitData(this);
    }

    /// <summary>
    /// 移动
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
      this.DragMove();
    }

    /// <summary>
    /// 窗口加载
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
      m_Work.BegionWork();
    }

    /// <summary>
    /// 执行完成
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    void m_Work_BackgroundWorkerCompleted(object sender, BackgroundWorkerEventArgs e)
    {
      m_MainWindow.Show();
      this.Close();
    }

    /// <summary>
    /// 赋值
    /// </summary>
    /// <param name="text"></param>
    private delegate void SetProcessLabelDelegate(string text, double processValue);
    public void SetProcessValue(string text, double processValue)
    {
      if (!Dispatcher.CheckAccess())
      {
        Dispatcher.Invoke(DispatcherPriority.Send, new SetProcessLabelDelegate(SetProcessValue), text, processValue);
        return;
      }
      this.lblProcess.Content = text;
      this.ProgressControlRealValue.Value = processValue;
    }
  }
}

以上所述就是本文的全部内容了,希望大家能够喜欢。

相关文章

  • asp.net保存网上图片到服务器的实例

    asp.net保存网上图片到服务器的实例

    本篇文章主要介绍了asp.net保存网上图片到服务器,非常具有实用价值,需要的朋友可以参考下。
    2016-10-10
  • asp.net 图片的读写入库实现代码

    asp.net 图片的读写入库实现代码

    asp.net对图片的读写,实现将图片保存到数据库中,然后再读取显示的实现代码。
    2009-11-11
  • asp.net Linq TO Sql 分页方法

    asp.net Linq TO Sql 分页方法

    临近春节,手头工作已告一段落,闲来无事写了一个 linq to sql 分页方法。代码若有不妥之处,请各位高手多提宝贵意见。
    2010-02-02
  • .NET 6开发TodoList应用之实现PUT请求

    .NET 6开发TodoList应用之实现PUT请求

    PUT请求本身其实可说的并不多,过程也和创建基本类似。这篇文章主要为大家介绍了.NET6实现PUT请求的示例详解,感兴趣的小伙伴可以跟随小编一起学习一下
    2021-12-12
  • asp.net 模拟提交有文件上传的表单(通过http模拟上传文件)

    asp.net 模拟提交有文件上传的表单(通过http模拟上传文件)

    通过HTTP模拟GET或POST请求,提交数据到服务端获取响应,比较常见些;但如上传文件到服务端,使用html form当然简单了,而因环境所限有时需要使用模拟方法去提交有附件(文件上传)的表单。
    2010-02-02
  • ASP.NET Core实现AES-GCM加密算法

    ASP.NET Core实现AES-GCM加密算法

    这篇文章介绍了ASP.NET Core实现AES-GCM加密的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • ASP.NET Core中如何利用Csp标头对抗Xss攻击

    ASP.NET Core中如何利用Csp标头对抗Xss攻击

    这篇文章主要给大家介绍了关于ASP.NET Core中如何利用Csp标头对抗Xss攻击的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用ASP.NET Core具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • asp.net实现在XmlTextWriter中写入一个CDATA的方法

    asp.net实现在XmlTextWriter中写入一个CDATA的方法

    这篇文章主要介绍了asp.net实现在XmlTextWriter中写入一个CDATA的方法,结合实例形式分析了XmlTextWriter写入CDATA的步骤与相关实现技巧,需要的朋友可以参考下
    2016-04-04
  • 详解asp.net core重新加载应用配置

    详解asp.net core重新加载应用配置

    这篇文章主要介绍了asp.net core重新加载应用配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • asp.net post方法中参数取不出来的解决方法

    asp.net post方法中参数取不出来的解决方法

    调试client端调用web api的代码,服务器端的post方法的参数死活取不出来,下面有个不错的解决方法,希望对大家有所帮助
    2014-01-01

最新评论