[英]How to keep ProgressBar Indeterminate animating
我一直在学习如何通过Threads( BackgroundWorker
等)解决这个问题,以及如何使UI保持响应。 我设法做到了,但是后来我意识到这不是我想要的。 我真正需要的只是在执行长时间的操作时显示动画的ProgressBar
。 (我不需要/不想更新UI,因为在该操作中,我将导出所有图形表示,并且绘图仪会不断更新)。
我考虑过在执行操作时弹出带有进度条的对话框。 问题是我得到了这个异常:
The calling thread cannot access this object because a different thread owns it
关于此有很多问题,答案是使用Dispatcher
:
Dispatcher.CurrentDispatcher.Invoke(() => myOperation(), DispatcherPriority.Normal);
这是完成的操作:
我正在使用Modern UI,有一个名为ModernDialog的对话框,它只是一个漂亮的对话框:
class DialogProgress
{
public ModernDialog progressDlg = new ModernDialog();
public DialogProgress()
{
ProgressBar bar = new ProgressBar();
bar.IsIndeterminate = true;
bar.Width = 150;
StackPanel content = new StackPanel();
content.Children.Add(bar);
progresoDlg.Content = content ;
//Thread paralel = new Thread(() => myOperation());
//paralel.SetApartmentState(ApartmentState.STA);
//paralel.Start();
Dispatcher.CurrentDispatcher.Invoke(() => myOperation(), DispatcherPriority.Normal);
}
void myOperation()
{
progresoDlg.ShowDialog();
}
}
我知道我在混合东西,有线程和分派器,但我不知道如何使用它们。
这是我称呼此对话框的方式:
public void MyLongMethod()
{
DialogProgress progress = new DialogProgress();
}
如果我仅使用Dispatcher,则会显示对话框,并且该栏正在设置动画,但MyLongMethod无法正常工作(它在关闭对话框后开始)。
如果我使用线程,则会遇到上述异常。
我怎么解决这个问题?
(使用对话框的PD只是一个建议,如果进度条位于UI中,并且在long方法开始/结束时切换可见性,我也很高兴)
Dispatcher.CurrentDispatcher.Invoke(...);
这是错误的,因为您使用了Invoke(),在调用的方法完成运行之前它不会返回。 这将需要一段时间,ShowDialog()是一个阻塞调用,直到用户关闭对话框后才完成。
一个简单的解决方法是改为使用BeginInvoke()。
假设ModernDialog
是WPF Window
,则ShowDialog方法在关闭之前不会返回。 调用也不会返回,直到调用操作并返回。 您需要使用Show而不是ShowDialog
,或者使用BeginInvoke而不是Invoke
。 我将使用Show
,因为ShowDialog
并没有真正的意义,除非您等待用户通过单击对话框按钮做出响应。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.