Revit二次开发-WPF ProgressBar 执行程序中显示进度条

Revit开发执行命令时如果时间长,界面会顶住,导致用户误以为程序未响应,解决方法:增加WPF ProgressBar 进度条执行程序中显示进度条,提示命令还是进行中,
实现流程:

  1. 新建一个WPF,Window启动时加载一个事件Loaded=“Window_Loaded”,用于显示进度条
  2. 在WPF后台,新建一个异步的事件更新进度条值
  3. 新建一个ProgressBarView类,singleton,instance创建显示、关闭进度条的方法
  4. 在Revit 执行主方法使用进度条
    直接上代码。
    WPF 前台代码:
<Window x:Class="MagicTools.ProgressView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             MaxHeight="25" MaxWidth="250" 
             Topmost="True"
             WindowStyle="None"
             WindowStartupLocation="CenterScreen" 
             Background="Transparent" 
             AllowsTransparency="True"
             Loaded="Window_Loaded" 
             >
    <Grid  >
        <ProgressBar x:Name="progressBar"
         Width="250" Height="25" 
         Minimum="0" Maximum="100" 
         Value="0" />
    </Grid>
</Window>

Window后台代码:

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
 public partial class ProgressView : Window
 {
    public ProgressView()
   {
       InitializeComponent();
   }
    private void Window_Loaded(object sender, RoutedEventArgs e)
 {
     //  异步执行进度更新任务,避免阻塞UI线程
     try
     {
         var progress = new Progress<double>(value => progressBar.Value = value);//回调
         DoJobAsync(progress);
     }
     catch (Exception)
     {
          throw;
     }

 }
   /// <summary>
  /// 更新进度条
  /// </summary>
  /// <param name="progress"></param>
  async void DoJobAsync(IProgress<double> progress)
  {
      try
      {
          while (true)
          {
              for (int i = 1; i <= 100; i++)
              {
                  await Task.Delay(50).ConfigureAwait(false);
                  progress.Report(i);//更新进度条值
               }
          }
      }
      catch (Exception)
      {
          this.Close();
      }
  }
}

新建一个ProgressBarView类

 public class ProgressBarView
 {
     private static ProgressBarView _instance;
     private Thread _progressBarThread;
     private ProgressView _progressView;
     public ProgressBarView()
     {
         if (_progressView == null) _progressView = new ProgressView();
     }
     public static ProgressBarView Instance
     {
         get
         {
             if (_instance == null)
             {
                 _instance = new ProgressBarView();
             }
             return _instance;
         }
     }


     /// <summary>
     /// 显示进度条
     /// </summary>
     public void ShowProgress()
     {
         //新开线程
         _progressBarThread = new Thread(new ThreadStart(() =>
         {
             _progressView = new ProgressView();
             _progressView.Show();//ShowDialog
             System.Windows.Threading.Dispatcher.Run();// 如果去掉这个,会发现启动的窗口显示出来以后会很快就关掉。
         }));
         _progressBarThread?.SetApartmentState(ApartmentState.STA);// 这个地方必须设置这个STA,否则会报错“调用线程必须为 STA,因为许多 UI 组件都需要。”
         _progressBarThread.IsBackground = true;
         _progressBarThread?.Start();// 开启线程

     }

     /// <summary>
     /// 关闭UI
     /// </summary>
     public void CloseProgress()
     {
         _progressBarThread?.Abort();
         _progressBarThread =  null;
     }
 }

使用ProgressBarView

 public void Execute(UIApplication uiapp)
 {
	 Stopwatch stopwatch = new Stopwatch();
	 try
	 {
	     stopwatch.Start();//计时开始
	     ProgressBarView.Instance.ShowProgress();
	    
		//这里写你的主程序,自行补充
		//.................
		
	     return;
	 }
	 catch (Exception e)
	 {
	      MessageBox.Show(e.ToString());
	 }
	 finally
	 {
	     //关闭进度条
	     ProgressBarView.Instance.CloseProgress();
	     stopwatch.Stop();//计时结束
	     var totalSec = stopwatch.Elapsed.TotalSeconds;
	     MessageBox.Show($"所花总时间:{Math.Floor(totalSec / 60)}{totalSec % 60:F3}秒 \n");
	 }
 }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值