WPF BusyIndi​​cator在后台线程上

时间:2013-07-24 09:51:25

标签: c# wpf wpftoolkit

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

2 个答案:

答案 0 :(得分:1)

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

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

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

祝你好运。

答案 1 :(得分:0)

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

请参阅此处的相关文章。 busy indicator during long wpf interface drawing operation

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