回答
这里首先要了解的是,你应该执行新/编辑/删除操作一个后台线程,以保持您的UI响应,并使ProgressBar
能够在这些操作完成所需的时间内进行更新。
将某些工作转移到后台线程的首选和最简单的方法是使用任务并行库(TPL)并开始一个新任务。请记住,WPF控件具有线程关联性,因此只能在它们最初创建的线程上访问它们,并且它是调度程序线程。
所以,你可以通过设置ProgressBar
到Visible
的Visibility
属性实现这一点,开始执行实际新建/编辑/删除操作的任务,然后设置Visibility
属性回Collapsed
再次,一旦任务完成:
C#:
pb.Visibility = Visibility.Visible;
Task.Run(()=>
{
//perform your long-running operation here...make sure that you don't access any UI elements
Save();
})
.ContinueWith(task =>
{
//this delegate will be executed back on the UI thread once the task has finished because of the scheduler returned from the TaskScheduler.FromCurrentSynchronizationContext() method...
pb.Visibility = Visibility.Collapsed;
}, System.Threading.CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
XAML:
<ProgressBar x:Name="pb" IsIndeterminate="True" Visibility="Collapsed" />
在C#中,您可以使用工具箱中的progressBar工具显示不确定的时间。
为了使用progressBar只需将它拖放到窗体上。
现在要解决主要问题,您需要显示一个不确定的时间。 要显示在进度条的进度,则使用定时器和以下代码:
int value = 0;
private void timer1_Tick(object sender, EventArgs e)
{
if (value < 100)//value at 100 can be any large integer since indeterminant time
{
value++;
progressBar1.Value = value;
}
}
组timer1.Interval = 100;
变量值是您为progressBar设置的最大值。
由于您不知道时间,因此将progressBar的最大值设置为10000或其他任何大值。 现在启用计时器,当你输入你的功能(说新/编辑/删除),并禁用计时器,当你退出你的功能
我不立这个解决方案。你只是“欺骗”进度栏的值。相反,可以使用@ mm8答案中指出的进度条的Indeterminate属性。 –
它可能是作弊,但会起作用。现在最主要的是,你没有告诉用户应用程序完成这些任务需要多少时间,因此不确定的时间。所以根据我的说法,当任务由应用程序完成时,您不需要显示100%的进度条。 –
我不认为这是很好的编程习惯。无论谁要在我之后维护代码,肯定都会浪费时间来弄清楚发生了什么。 – Igavshne
- 1. autoProcessQueue为false时进度条不工作
- 2. 背景工作进度条
- 3. ReactJS进度条不工作
- 4. 进度条不工作?
- 5. 进度条和计时器
- 6. 使用进度条异步加载耗时的脚本
- 7. 进度条的Js代码,不工作
- 8. 如何制作类似iPhone进度条的进度条和进度对话框?
- 9. 从工作线程更新进度条
- 10. qt进度条不能正常工作
- 11. 进度条无法正常工作
- 12. 进度条不工作与ASIHTTPRequest
- 13. 进度条工作不冲水
- 14. Android进度条无法正常工作
- 15. 不能让进度条工作
- 16. 进度条无法正常工作
- 17. 在工作时显示带进度条的窗口
- 18. 音乐播放器的进度条不工作和崩溃
- 19. r和系统时间的进度条
- 20. CodeIgniter和进度条
- 21. parSapply和进度条
- 22. 进度条和requiredfieldvalidator
- 23. Miltitasking和进度条
- 24. 更新后台工作进度条时出现异常
- 25. 如何在进度条工作时处理屏幕翻转?
- 26. Java进度条与应用程序代码同时工作
- 27. jTextfield和进度条不起作用
- 28. c#winform后台工作人员和进度条
- 29. C#进度条基于事件和delgate不工作
- 30. 一个后台工作线程和多个进度条
上面给出的C#通常位于xaml.cs文件中吗?我在ViewModel中具有新建/编辑/删除功能,并通过命令“访问”。我对WPF和MVVM非常陌生,我只是试图找到最好的做法,但我并不是很擅长。此外,例如删除,我从列表框(显然是一个UI元素),也从解决方案资源管理器(我忙于一个VS包扩展)删除项目,这最后一个需要几秒钟。所以我不确定我不应该像你说的那样访问一个UI元素? – Igavshne
应该在视图模型中实现新建/编辑/删除功能。不是直接设置ProgressBar的Visibility属性,而是设置绑定到ProgressBar的源属性的值。我猜你的操作实际上执行了一些可能需要一些时间的工作,例如与数据库或服务层进行通信。如果你只是想从列表框中删除一个项目,或者更确切地说是绑定到列表框的ObservableCollection,你根本不需要ProgressBar。 – mm8
啊,是的,当然,我可以设置绑定到ProgressBar的源属性的值。是的,我确实与一个数据库进行了沟通。谢谢,我会尝试你的答案,然后回来。 – Igavshne