视觉显示进度

时间:2015-06-24 19:00:32

标签: c# function report progress

我有一个执行多个步骤的功能,一次一个,我想显示一个表单或某些东西告诉用户他们的功能正在被处理

基本上,主表单中的函数如下所示:

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

因此,我们的想法是告知用户正在处理的事情,因为在步骤1,2和3期间,GUI仍然没有响应。我不想使用简单的ProgressBar,它是一个图像处理软件,并且没有空间来添加ProgressBar,它应该是基本上弹出的东西。我正在思考另一种形式,但不确定它会如何发挥作用..

关于如何做到这一点的任何想法?

谢谢,

的Matias。

3 个答案:

答案 0 :(得分:1)

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

创建另一个表单(在我的情况下为Progress)并在其上放置一些可视化进度的内容。就我而言,它看起来像这样:

Progess form

表单本身的FormBorderStyle设置为FixedToolWindowStartPosition设置为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);
}

要显示弹出进度,只需致电PopupJob即可。 OurRealJob可以替换为您的代码。

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

答案 1 :(得分:0)

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


progressBar1.PerformStep();

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

答案 2 :(得分:0)

如果您使用的是WinForms,您会找到符合您期望的课程: 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
    }