在AutoCAD .NET API中可以使用Autodesk.AutoCAD.Runtime.ProgressMeter 对象来显示冗长的执行过程的进度。这是AutoCAD中内置的一个进度条。
然而,ProgressMeter常常无法表现出令人满意的进度视觉效果。ProgressMeter显示的处理效果可能因 AutoCAD 版本而不同,并且在许多情况下,进度条在长时间处理过程中根本不会刷新。
下面我创建一个WPF进度条窗体,窗体可以在一个项目中多次复用,同时让我们对进度条窗体拥有更多的控制权。WPF也可以提供更多的进度视觉效果。最重要的是,从心理上来说,当用户盯着冻结的 AutoCAD 屏幕等待 10 秒而不是 5 秒时,用户会觉得任务执行得更快。
首先,我定义一个将由进度条组件使用的接口。接口包含三个事件和一个方法:ProcessingStarted(任务开始)、ProcessingEnded(任务结束)、CloseProgressRequested(关闭窗体)、DoProcessingWork(当进度窗体显示时,会立即执行此方法。使用IProgress<ITaskProgressInfo> progressInfo传递任务的信息,CancellationToken cancellationToken允许取消任务)。具体请看下面代码:
using System;
using System.Threading;
namespace AutoCADTest
{
/// <summary>
/// 可报告任务进度接口
/// </summary>
public interface ITaskProgress
{
/// <summary>
/// 任务开始
/// </summary>
event TaskProcessStarted ProcessingStarted;
/// <summary>
/// 任务结束
/// </summary>
event EventHandler ProcessingEnded;
/// <summary>
/// 关闭窗体
/// </summary>
event EventHandler CloseProgressRequested;
/// <summary>
/// 执行任务报告进度
/// </summary>
/// <param name="progressInfo">任务进度信息</param>
/// <param name="cancellationToken">取消任务</param>
void DoProcessingWork(IProgress<ITaskProgressInfo> progressInfo, CancellationToken cancellationToken);
}
/// <summary>
/// 传递任务进度信息接口
/// </summary>
public interface ITaskProgressInfo
{
/// <summary>
/// 当前任务进度
/// </summary>
int CurrentProgress { get; set; }
/// <summary>
/// 当前任务进度说明
/// </summary>
string ProgressDescription { get; set; }
}
public class TaskProgressInfo : ITaskProgressInfo
{
public int CurrentProgress { get; set; }
public string ProgressDescription { get; set; }
}
/// <summary>
/// 进度窗体的初始化信息
/// </summary>
public class TaskProcessStartedEventArgs : EventArgs
{
private int _loopTatialCount;
private string _windowTitle;
private bool _canCancel;
public TaskProcessStartedEventArgs(
string windowTitle, int loopTatialCount = 0, bool canCancel = false)
{
_loopTatialCount = loopTatialCount;
_windowTitle = windowTitle;
_canCancel = canCancel;
}
/// <summary>
/// 任务循环总数
/// </summary>
public int LoopTatialCount
{
get { return _loopTatialCount; }
}
/// <summary>
/// 窗体标题
/// </summary>
public string WindowTitle
{
get { return _windowTitle; }
}
/// <summary>
/// 任务是否支持取消
/// </summary>
public bool CanCancel
{
get { return _canCancel; }
}
}
public delegate void TaskProcessStarted(
object sender, TaskProcessStartedEventArgs e);
}
创建一个WPF进度条窗体。包含一个TextBlock(显示任务描述)、ProgressBar(显示任务进度)、Button(取消任务)。请看下面代码:
ProgressWindow.