簡體   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