我正在使用wpf工具包忙指示器,它在我的UI上提供覆盖,同时进行后台操作。控件中有一个进度条设置为不确定,当我的后台任务正在进行时这是正常的。后台任务完成后,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();
}
答案 0 :(得分:1)
我不相信你能做到这一点。您无法从后台线程访问UI控件。此外,您可能会发现正在忙于呈现或通知并使进度条冻结的UI线程。
我在大型WPF应用程序中有类似的设置,它也遇到了同样的问题。在从数据库中提取数据时,忙指示符显示正常,但是当应用程序开始在UI中呈现数据时,忙指示符会冻结。
我甚至尝试使用GIF动画来解决这个问题,但当然它们并没有在WPF应用程序中制作动画(自己)。编写代码来为Gif中的帧设置动画后,我发现它也遇到了同样的问题,我感到非常失望。
祝你好运。
答案 1 :(得分:0)
不,当UI正在更新/使用后台线程或其他东西时,无法显示BusyIndicator动画。
请参阅此处的相关文章。 busy indicator during long wpf interface drawing operation
在UI更新完成之前,您可以显示一些静态图像以指示忙碌符号。