• 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;
         }
    
     }
       /// 
      /// 更新进度条
      /// 
      /// 
      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;
             }
         }
    
    
         /// 
         /// 显示进度条
         /// 
         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();// 开启线程
    
         }
    
         /// 
         /// 关闭UI
         /// 
         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");
    	 }
     }
    
  • 相关阅读:
    【三维目标检测】Part-A2(二)
    微信小程序左滑删除(Slideview)
    电力感知边缘计算网关产品设计方案-业务流程设计
    es查询初学
    Java - 将TXT文本文件转换为PDF文件
    Zookeeper经典应用场景实战
    低代码技术这么香,如何把它的开发特点发挥到极致?
    华为od 面试题及流程 (前后端)
    笔试强训Day5
    计算机毕业设计之java+ssm基于web的智能卤菜销售平台
  • 原文地址:https://blog.csdn.net/weixin_46563153/article/details/139292875