我正在使用wpf工具包忙指標,它在後臺操作發生時在我的用戶界面上提供覆蓋。控制器中有一個進度條,在我的後臺任務正在進行時設置爲不確定,這很好。一旦後臺任務完成,用戶界面需要更新,可能需要1-2秒。這當然會導致進度條凍結,看起來很醜。WPF BusyIndicator在後臺線程上
我的問題是,我怎樣才能在後臺線程上旋轉繁忙指示器,以便進度條一直向上移動直到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();
}
聽起來像你應該做的後臺線程繁重的工作。因爲UI控件具有線程親和性,但業務邏輯不應該這樣,這對我來說似乎是正確的方法。 – DHN
我添加了我的加載代碼。 'GetLoadDaysTask()'返回一個到DataService的任務,然後在我的視圖模型中更新一定數量的綁定屬性。掛起發生在RaisePropertyChanged調用中,因爲它需要加載UI。有沒有更好的辦法可以做到這一點? – ChrisO
從1529行查看我的代碼https://github.com/quitrk/MiniDeskTube/blob/master/DeskTube/ViewModels/MainPageViewModel.cs。 IsLoading標誌綁定到BusyIndicator的IsBusy屬性。重要的是,您需要運行代碼來更新Dispatcher線程中UI的內容。 –