本帖最后由 Richard.Ma 于 2020-9-25 15:50 编辑
在设计应用程序时,您需要考虑如何处理数据加载,以确保应用程序始终保持对用户的响应。通常,通过在后台线程上异步加载数据来避免主窗体的阻塞,让用户可以继续与应用程序进行交互。 问题是,如果没有适当的可视化界面,用户可能会想知道此时正在进行的后台活动过程。这需要使用进度条来指示某些活动正在后台执行。加载数据完成后,进度条会被隐藏,并显示用于显示数据的相关控件。 让我们来看一些使用WinForms和WPF中的进度条的示例。
时间不确定进度条第一步是异步加载数据,以使应用程序UI在比正常加载时间长的时间内保持响应状态。在.NET中,使用等待的方法调用可以很轻松地处理此问题。这意味着,等待操作之后发生的任何代码只有在操作完成后才能运行。如下所示是最简单的解决方案。 - private async Task LoadData()
- {
- // show progress bar
- progressBar1.Visible = true;
- await LoadDataAsync();
- // hide progress bar
- progressBar1.Visible = false;
- }
复制代码
您所要做的就是在等待数据加载之前设置进度条的可见性,然后在操作完成后将其设置为不可见。如果进度条是“不确定的”,这将很好地工作,这意味着它将无限期地循环遍历加载动画,直到您停止它为止。 今天,在加载数据时显示不确定的进度条或环是一种常见的设计范例。这是很流行的,因为在无法预测的网络中,我们无法确切知道可能需要多长时间。我们正在呼叫的服务器可能无法或不愿意通知我们需要多长时间。 若要在WinForms中创建不确定的进度条,请将其Style属性设置为Marquee。在WPF中,将其IsIndeterminate属性设置为True。
持续进度条进度条不确定的缺点是用户不知道还剩下多少时间。另一种方法是在加载数据时向进度条报告进度。这种方法在安装软件中很流行,因此用户可以准确地知道还剩下多少进度(有时还需要多少时间)。根据您的数据解决方案,也可以在数据加载期间使用此功能。 让我们看一个使用后台工作程序而不是等待代码的代码示例,以便我们可以完全控制更新进度条。 - BackgroundWorker worker = new BackgroundWorker();
- public App()
- {
- InitializeComponent();
- // set background worker
- worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
- worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
- worker.DoWork += new DoWorkEventHandler(worker_DoWork);
- worker.WorkerReportsProgress = true;
- }
复制代码
要设置后台工作程序,我们必须侦听ProgressChanged,RunWorkerCompleted和DoWork事件。 这是我们在每种方法中所做的: - DoWork:执行应用程序的实际工作(例如加载数据),并在可能的情况下使用其ReportProgress方法向进度条报告进度。这将触发ProgressChanged事件。如果要加载数据,请尝试以大块形式加载它并报告两次之间的进度。
- ProgressChanged:更新进度栏的实际值。此事件接受参数,你可以根据工作量传递可变数量。
- RunWorkerCompleted:完成进度,例如隐藏进度栏或向用户显示消息。
要启动整个过程,只需调用RunWorkerAsync方法。 - // run background worker
- worker.RunWorkerAsync();
复制代码
WPF中的自定义进度栏ComponentOne为WPF提供了自定义进度栏控件。C1ProgressBar控件是根据Windows 8-10上使用的本机进度指示器建模的,以提供现代的用户体验。它可以显示为点的动画循环模式,以指示不确定的操作正在进行中。同样,C1ProgressIndicator控件显示一个加载环。 您可以使用C1ProgressBar和C1ProgressIndicator控件来显示进度条
|