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");
	 }
 }
### 如何在Revit中实现进度条并设置项目进度视图 为了实现在 Revit显示进度条的功能,可以借助 WPF 或 Windows Forms 的 `ProgressBar` 控件,并结合 Revit API 进行二次开发。以下是具体的方法: #### 使用 WPF 实现进度条功能 可以通过创建一个独立的窗口来显示进度条,并将其集成到 Revit 插件中。以下是一个基于引用[2]中的代码示例[^2],展示了如何在执行复杂操作时动态更新进度条。 ```csharp public void Execute(UIApplication uiapp) { Stopwatch stopwatch = new Stopwatch(); try { stopwatch.Start(); // 计时开始 ProgressBarView.Instance.ShowProgress(); // 显示进度条 // 主程序逻辑部分(此处模拟耗时任务) for (int i = 0; i <= 100; i++) { System.Threading.Thread.Sleep(50); // 模拟延迟 ProgressBarView.Instance.UpdateProgress(i); // 更新进度条状态 } 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}秒"); } } ``` 上述代码实现了启动进度条、实时更新以及最终关闭进度条的过程。其中,`UpdateProgress(int progress)` 方法用于传递当前的任务完成百分比给进度条控件。 --- #### 利用 Dispatcher 类优化线程处理 如果需要进一步提升性能,可以引入 `Dispatcher` 来管理 UI 和后台计算之间的交互。这种方式能够有效避免因长时间运行的操作阻塞主线程而导致的应用无响应问题。参考引用[3]的内容[^3],下面是一段简化版的代码片段: ```csharp private int _progressValue; public void UpdateUI() { Application.Current.Dispatcher.Invoke(() => { progressBar.Value = _progressValue; // 更新进度条数值 }); } // 耗时任务函数 private void LongRunningTask() { for (int i = 0; i <= 100; i++) { Thread.Sleep(50); // 模拟延迟 _progressValue = i; // 修改共享变量 UpdateUI(); // 同步更新界面 } } ``` 此方法通过调用 `Application.Current.Dispatcher.Invoke()` 将 UI 更新操作调度至主线程上执行,从而确保多线程环境下的安全性。 --- #### 配合动画展示设备安装顺序 对于复杂的工厂布局设计,除了简单的进度条外,还可以加入三维模型动画以增强用户体验。根据引用[1]提到的需求[^1],可以在每次加载新组件之前暂停片刻,并触发相应的视觉反馈机制。例如,在每一步完成后刷新场景视图: ```csharp foreach (var elementId in elementsToInstall) { Element currentElement = doc.GetElement(elementId); using (Transaction tx = new Transaction(doc, "Install Component")) { tx.Start(); InstallComponent(currentElement); // 自定义安装逻辑 tx.Commit(); } TaskDialog.Show("Installation", $"Installed {currentElement.Name}"); View3D activeView = doc.ActiveView as View3D; if (activeView != null) { activeView.RefreshDisplay(); // 刷新视图 } } ``` 该脚本会逐一激活各阶段的建模过程,并向用户提供即时通知。 --- ### 总结 综上所述,要在 Revit 中成功实现进度条功能及其关联的项目进展可视化效果,需综合运用多种技术手段,包括但不限于 WPF/Windows Forms 编程技巧、异步编程模式以及 Revit API 提供的核心工具集。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值