C# Winform实现启动界面进度条显示

向北走
向北走
发布时间:2026-10-15 | 4人浏览过
原创

在C# Winform开发中,对于需要初始化较多资源或读取大型配置文件的应用程序,增加一个带有进度条的启动(Splash)界面能有效提升用户体验。本文将分享如何使用Timer和委托机制安全地更新UI线程,并控制主程序与启动界面的执行顺序。

结果与目标

创建一个名为 StartForm 的启动窗体。在该窗体内放置一个 ProgressBar 和 Timer 控件。随着程序的“加载”(在此示例中以时间递增模拟),进度条逐步填充,达到最大值后自动关闭并进入主程序界面。

准备条件

1. 使用 Visual Studio 创建一个新的 Windows Forms App (.NET Framework 或 .NET Core/5+) 项目。 2. 向项目中添加一个新窗体,命名为 StartForm.cs。 3. 确保引用了必要的命名空间: System.Windows.Forms, System.Threading(用于处理线程相关操作)。

界面设计参考:

图1:启动界面 StartForm 的基本布局

真实操作顺序

第1步:拖拽并设置控件属性

在 StartForm 的设计视图中,从工具箱拖入以下控件并修改其属性:

  • Timer 控件:
    • 名称: timerStart
    • 描述: 用于触发进度更新的定时器事件。
  • 图2:添加 Timer 控件

  • ProgressBar 控件:
    • 名称:建议改为更具语义的名称,如 PBress(文中示例名称)或 progressBar1。
    • 重要参数:
      - Maximum: 设置进度条的最大值(例如设置为 32,可根据实际逻辑调整)。
      - Minimum: 默认为 0。
      - Step: 默认 1,也可根据需求设为其他值。
    • 初始可见性: Visible = true。
  • 图3:配置 ProgressBar 属性

第2步:编写 StartForm 后台代码

为了解决跨线程访问 UI 控件的安全性问题,需要使用委托(Delegate)来修改进度条的值。以下是完整的 StartForm.cs 代码逻辑:

using System;
using System.Windows.Forms;

namespace MVtest // 请替换为您的实际命名空间
{
    public partial class StartForm : Form
    {
        public StartForm()
        {
            InitializeComponent();
        }

        // 定义委托,用于跨线程更新UI
        private delegate void TIMEinvoke(int val);

        // 委托方法:检查是否在主线程,如果是则直接更新,否则调用Invoke
        private void DataDisplay(int val)
        {
            if (this.InvokeRequired)
            {
                TIMEinvoke myIvoke = new TIMEinvoke(DataDisplay);
                this.Invoke(myIvoke, new object[] { val });
            }
            else
            {
                // 假设控件名为 PBress
                if (PBress != null)
                {
                    PBress.Value = val;
                }
            }
        }

        // 计数器
        int times = 0;

        // Timer 事件处理函数
        private void timerStart_Tick(object sender, EventArgs e)
        {
            times++;
            // 更新进度条
            DataDisplay(times);

            // 判断是否达到最大值(假设 Maximum 设为 32)
            if (times >= PBress.Maximum)
            {
                PBress.Visible = false; // 隐藏进度条
                timerStart.Enabled = false; // 停止计时器
                this.Close(); // 关闭启动窗体
            }
        }

        // 窗体加载事件
        private void StartForm_Load(object sender, EventArgs e)
        {
            timerStart.Interval = 100; // 设定间隔时间为100毫秒
            timerStart.Enabled = true; // 启用定时器
            PBress.Visible = true;     // 显示进度条
            PBress.Maximum = 32;       // 设定最大刻度值
        }
    }
}

第3步:修改 Program.cs 启动顺序

为了让系统在启动时先显示启动窗体,再显示主窗体,需要修改 Program.cs 文件中的 Main 方法。关键在于移除传统的 Application.Run(new MainForm()); 单一入口,改为串行运行两个窗体。

using System;
using System.Windows.Forms;

namespace MVtest
{
    internal static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            
            // 1. 首先运行启动窗体(StartForm)
            // 当 StartForm 被 Close() 时,此方法才会继续向下执行
            Application.Run(new StartForm());
            
            // 2. 启动窗体关闭后,运行主窗体(MainForm)
            Application.Run(new MainForm());
        }
    }
}

运行效果预期:

启动应用后,系统会弹出 StartForm,此时 Timer 开始工作,每隔 100 毫秒将进度条数值加 1,直到数值达到 32(即满格),随后自动关闭窗口并跳转至主界面。

图4:运行后的启动界面与后续主程序衔接示意

简要总结

以上就是 C# Winform 实现启动界面进度条显示的详细内容。通过使用 Timer 进行定时触发配合 Delegate 解决跨线程 UI 更新问题,可以轻松打造专业的应用程序加载过渡页,更多关于 C# Winform 进阶技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表