繁体   English   中英

如何保持ProgressBar不确定的动画

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM