簡體   English   中英

進度欄未在WPF UI上更新

[英]Progress bar not getting updated on WPF UI

我正在使用下面的代碼來顯示WPF(MVVM)應用程序中的進度條狀態,該應用程序基本上是在線程上,但是如果我使用的是調度程序線程,則其狀態不會在UI上更新。

帶螺紋:

Main()
    {


      Thread LoadApp = new Thread(MyData);
            LoadApp.Start();
    }

public void MyData()
{
        ProgMessage = "10%";
        ProgValue = 10;
        var varAction = new List<Func<object>>();
        varAction .Add(() => (MainViewMode1)ViewModel1.ViewModel1);
        varAction .Add(() => (MainViewMode2)ViewModel2.ViewModel2);
        varAction .Add(() => (MainViewMode3)ViewModel3.ViewModel3);

        foreach (var action in varAction )
        {
            var obj = action();
            ProgressMessage = // My message from VM
            ProgressBarValue += // My message valuefrom VM;
        }

}

這工作正常,但是因為現在我正在使用依賴項屬性,所以我得到了跨線程異常(STA),因此將代碼更改為:

Main()
{

           Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(() =>
            {
               MyData();

            }));

}



 public void MyData()
    {
            ProgMessage = "10%";
            ProgValue = 10;
            var varAction = new List<Func<object>>();
            varAction .Add(() => (MainViewMode1)ViewModel1.ViewModel1);
            varAction .Add(() => (MainViewMode2)ViewModel2.ViewModel2);
            varAction .Add(() => (MainViewMode3)ViewModel3.ViewModel3);

            foreach (var action in varAction )
            {
                var obj = action();
                ProgressMessage = // My message from VM
                ProgressBarValue += // My message valuefrom VM;
            }

   }

現在,我擺脫了線程錯誤,但是它不更新UI上的進度欄狀態嗎?

有什么線索嗎?

在您放棄對調度程序線程的控制之前,UI元素不會更新。 通常,您可以通過返回事件循環來做到這一點,這通常意味着只返回即可。 但是,如果您有很多工作要做循環,那么這實際上是不實際的。 因此,通常,您不想在UI線程上進行此類工作。

當您說“使用依賴項屬性”時,是否表示ViewModel類的屬性是依賴項屬性? 您可能需要重新考慮,因為它阻止了多線程的使用。 如果將它們設置為普通的非自動屬性,則仍可以使用數據綁定將它們連接到UI。 要使UI在屬性更改時更新,您需要實現INotifyPropertyChanged ,並使屬性引發更改通知,然后您將發現可以在工作線程上進行工作,如第一個示例,並且如果將這些屬性綁定到UI,則不會出現線程異常,並且可以正常更新。

(WPF的數據綁定系統檢測UI線程以外的線程上的綁定屬性何時發生更改,並自動安排從正確的線程更新UI。但是,如果您想利用此優勢,則不能在VM中使用DP。 ,因為DPS具有線程相似性。)

其他人提出的DoEvents樣式方法確實可以奏效,但這是有問題的,我避免了。 它實現了重新進入-如果用戶以導致事件處理程序運行的方式與您的應用進行交互,則它們將在對Dispatcher.PushFrame調用內運行。 這不一定是問題,但是很容易陷入混亂。

還有一種方法是在輔助線程上完成工作,但是使用Dispatcher.Invoke調用更新ProgressMessageProgressBarValue屬性的方法。 這樣,您的工作就在工作線程上進行(使UI線程可以自由更新),但是您將在UI線程上更新這些DP,從而避免了錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM