直观地显示进度

Show Progress Visually

我有一个函数可以执行多个步骤,一次一个,我想显示一个表单或其他东西来告诉用户他们的函数正在处理中

基本上主窗体中的函数如下所示:

 public void MyFunction ()
{
//Step1, takes aproximately 20 seconds
//Step2, takes 10 seconds
//Step3, takes about 25 seconds
}

因此,我们的想法是通知用户某些事情正在处理中,因为在第 1、2 和 3 步期间,GUI 仍然没有响应。我不想用一个简单的ProgressBar,它是一个图像处理软件,没有space添加ProgressBar,它应该是弹出的东西。我正在考虑另一种形式,但不确定它是如何工作的..

关于如何做到这一点有什么想法吗?

谢谢,

马蒂亚斯。

在 C#.NET 中有一个进度条对象。它有一个名为 step 的 属性 ,它是一个整数,可以按该值增加进度。您可以通过 运行 PerformStep() 方法来增加进度。可能看起来像这样。


progressBar1.PerformStep();

您必须弄清楚您希望如何衡量进度。 您可以隐藏对象并使用弹出窗口中的值 window.

如果您使用的是 WinForms,您会在那里找到符合您期望的 class: SxProgress overview and source code

SxProgress.Execute("XXXXX in progress...",3,false,false,myFunction_ExecInThread,new object[]{})

    private bool myFunction_ExecInThread,_ExecInThread(int ItemIndex,object[] UserObjects)
    { // 3 steps ==> ItemIndex varies from 0 to 2
      switch (i)
        { 
           case 0 : // your step 1 code there
                    // if you have a n/count progress info in step 1 process, use this:
                    // SetSubProgressValue(n,count,UserObjects) 
                    break ;
           case 1 : // your step 2 code there
           case 2 : // your step  3 code there
        }
       return true ; // or false if a step fails
    }

要创建一个简单的解决方案,请考虑:

创建另一个表格(在我的例子中是 Progress)并在上面放置一些可视化进度的东西。就我而言,它看起来像这样:

表单本身将 FormBorderStyle 设置为 FixedToolWindow,将 StartPosition 设置为 CenterParent

现在将构造函数更改为 BackgroundWorker 参数并设置事件并启动进程。

public Progress(BackgroundWorker task)
{
    InitializeComponent();
    task.RunWorkerCompleted += (sender, args) => Close();
    task.ProgressChanged += (sender, args) => pB_progress.Value = args.ProgressPercentage;
    task.RunWorkerAsync();
}

在主窗体中添加如下内容:

private void PopupJob()
{
    var worker = new BackgroundWorker
    {
        WorkerSupportsCancellation = false,
        WorkerReportsProgress = true
    };
    worker.DoWork += OurRealJob;
    new Progress(worker).ShowDialog();
}

private void OurRealJob(object sender, DoWorkEventArgs doWorkEventArgs)
{
    var wrk = (BackgroundWorker) sender;
    Thread.Sleep(1000);
    wrk.ReportProgress(30);
    Thread.Sleep(5000);
    wrk.ReportProgress(100);
}

要显示弹出进度,只需调用 PopupJobOurRealJob 可以替换为您的代码。

当您这样做时,代码将在后台 运行 并且表单将保持响应。因为我们正在调用 Form.ShowDialog() 进度表将在最前面,并且在作业完成之前不能使用主窗体。