直观地显示进度
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);
}
要显示弹出进度,只需调用 PopupJob
。 OurRealJob
可以替换为您的代码。
当您这样做时,代码将在后台 运行 并且表单将保持响应。因为我们正在调用 Form.ShowDialog()
进度表将在最前面,并且在作业完成之前不能使用主窗体。
我有一个函数可以执行多个步骤,一次一个,我想显示一个表单或其他东西来告诉用户他们的函数正在处理中
基本上主窗体中的函数如下所示:
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);
}
要显示弹出进度,只需调用 PopupJob
。 OurRealJob
可以替换为您的代码。
当您这样做时,代码将在后台 运行 并且表单将保持响应。因为我们正在调用 Form.ShowDialog()
进度表将在最前面,并且在作业完成之前不能使用主窗体。