我有一个执行多个步骤的功能,一次一个,我想显示一个表单或某些东西告诉用户他们的功能正在被处理
基本上,主表单中的函数如下所示:
public void MyFunction ()
{
//Step1, takes aproximately 20 seconds
//Step2, takes 10 seconds
//Step3, takes about 25 seconds
}
因此,我们的想法是告知用户正在处理的事情,因为在步骤1,2和3期间,GUI仍然没有响应。我不想使用简单的ProgressBar,它是一个图像处理软件,并且没有空间来添加ProgressBar,它应该是基本上弹出的东西。我正在思考另一种形式,但不确定它会如何发挥作用..
关于如何做到这一点的任何想法?
谢谢,
的Matias。
答案 0 :(得分:1)
要创建一个简单的解决方案,请考虑以下事项:
创建另一个表单(在我的情况下为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);
}
要显示弹出进度,只需致电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
}