バックグラウンド操作が行われている間、UI の上にオーバーレイを提供する wpf ツールキットのビジー インジケーターを使用しています。バックグラウンド タスクが進行している間は、不確定に設定されているコントロールに進行状況バーがあります。バックグラウンド タスクが完了すると、UI を更新する必要があり、これには 1 ~ 2 秒かかることがあります。もちろん、これによりプログレスバーがフリーズし、見苦しくなります。
私の質問は、バックグラウンド スレッドでビジー インジケーターをスピンアップして、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();
}