AutoCAD二次开发:C#实现一个WPF进度条窗体,实时显示任务进度

在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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值