2

我正在使用 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();
}
4

2 回答 2

0

不,当 UI 更新/使用后台线程或其他东西时,无法显示 BusyIndi​​cator 动画。

请参阅此处的相关帖子。 长时间 wpf 界面绘制操作期间的繁忙指示器

在 UI 更新完成之前,您可以显示一些静态图像来指示忙碌的标志。

于 2013-07-24T10:32:30.740 回答
0

我不相信你能做到这一点。您无法从后台线程访问 UI 控件。此外,您可能会发现是 UI 线程忙于渲染或通知并使进度条冻结。

我在大型 WPF 应用程序中有类似的设置,它也遇到了同样的问题。在从数据库中获取数据时,忙碌指示器显示正常,但是当应用程序开始在 UI 中呈现数据时,忙碌指示器会冻结。

我什至尝试使用动画 Gif 来解决这个问题,但当然它们不会在 WPF 应用程序中(自己)制作动画。在编写了为 Gif 中的帧设置动画的代码后,我很失望地发现它也遇到了同样的问题。

祝你好运。

于 2013-07-24T10:33:00.600 回答