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