2013-07-24 42 views
2

我正在使用wpf工具包忙指標,它在後臺操作發生時在我的用戶界面上提供覆蓋。控制器中有一個進度條,在我的後臺任務正在進行時設置爲不確定,這很好。一旦後臺任務完成,用戶界面需要更新,可能需要1-2秒。這當然會導致進度條凍結,看起來很醜。WPF BusyIndi​​cator在後臺線程上

我的問題是,我怎樣才能在後臺線程上旋轉繁忙指示器,以便進度條一直向上移動直到UI變得響應?只要進度條不凍結,我就可以接受其他解決方案。

下面是一些示例代碼:

<xctk:BusyIndicator IsBusy="{Binding IsBusy}" Style="{StaticResource BusyIndicatorStyle}"> 
    <DockPanel Margin="3"> 
     <TextBlock DockPanel.Dock="Top" Style="{StaticResource WorkspaceHeaderStyle}" Text="User Management"/> 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto"/> 
       <RowDefinition Height="*"/> 
      </Grid.RowDefinitions> 
      <ToolBar Grid.Row="0"> 
       <Button Content="Save changes" Command="{Binding SaveChangesCommand}"/> 
      </ToolBar> 
      <TabControl Grid.Row="1"> 
       <TabItem Header="Users" DataContext="{Binding UsersViewModel}"> 
        <users:UsersView /> 
       </TabItem> 
       <TabItem Header="Roles" DataContext="{Binding RolesViewModel}"> 
        <roles:RolesView /> 
       </TabItem> 
      </TabControl> 
     </Grid> 
    </DockPanel> 
</xctk:BusyIndicator> 
private void LoadDays() 
{ 
    ProgressIsBusy = true; 

    var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); 

    var loadDaysTask = GetLoadDaysTask(uiScheduler); 

    loadDaysTask.ContinueWith(antecedent => 
    { 
     RaisePropertyChanged(() => ForecastViewModel); 
     RaisePropertyChanged(() => AverageHandleTimeViewModel); 
     RaisePropertyChanged(() => GeneralOptionsViewModel); 
     RaisePropertyChanged(() => ScheduledHoursViewModel);   

     IsUserEditing = true; 
     ProgressIsBusy = false; 

    }, TaskScheduler.FromCurrentSynchronizationContext()); 

    loadDaysTask.Start(); 
} 
+0

聽起來像你應該做的後臺線程繁重的工作。因爲UI控件具有線程親和性,但業務邏輯不應該這樣,這對我來說似乎是正確的方法。 – DHN

+0

我添加了我的加載代碼。 'GetLoadDaysTask()'返回一個到DataService的任務,然後在我的視圖模型中更新一定數量的綁定屬性。掛起發生在RaisePropertyChanged調用中,因爲它需要加載UI。有沒有更好的辦法可以做到這一點? – ChrisO

+0

從1529行查看我的代碼https://github.com/quitrk/MiniDeskTube/blob/master/DeskTube/ViewModels/MainPageViewModel.cs。 IsLoading標誌綁定到BusyIndi​​cator的IsBusy屬性。重要的是,您需要運行代碼來更新Dispatcher線程中UI的內容。 –

回答

1

我不相信你能做到這一點。您無法從後臺線程訪問UI控件。此外,您可能會發現正在忙於渲染或通知並使進度欄凍結的UI線程。

我有一個類似的大規模WPF應用程序的設置,它遭受同樣的問題。從數據庫中提取數據時,繁​​忙指示器顯示正常,但當應用程序開始在UI中呈現數據時,忙指示器凍結。

我甚至嘗試過使用動畫Gif來解決這個問題,但是他們當然不會在WPF應用程序中動畫(本身)。編寫了代碼來爲Gif中的框架製作動畫,我非常失望地發現它也遭遇了同樣的問題。

祝你好運都一樣。

相關問題