2

バックグラウンド操作が行われている間、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();
}
4

2 に答える 2

0

私はあなたがそれをすることができるとは思わない. バックグラウンド スレッドから UI コントロールにアクセスすることはできません。また、UI スレッドがレンダリングや通知にビジーで、プログレス バーがフリーズしていることに気付く場合もあります。

大規模な WPF アプリケーションで同様の設定を行っていますが、同じ問題に悩まされています。ビジー インジケーターは、データがデータベースからフェッチされている間は正常に表示されますが、アプリケーションが UI でデータのレンダリングを開始すると、ビジー インジケーターがフリーズします。

この問題を回避するためにアニメーション Gif を使用することも試みましたが、もちろん、WPF アプリケーションでは (単独では) アニメーション化されません。Gif のフレームをアニメーション化するコードを作成した後、同じ問題が発生していることに非常に失望しました。

頑張ってください。

于 2013-07-24T10:33:00.600 に答える
0

いいえ、UI が更新中またはバックグラウンド スレッドなどを使用しているときに、BusyIndi​​cator アニメーションを表示することはできません。

関連記事はこちらから。 長い wpf インターフェイス描画操作中のビジー インジケーター

UI の更新が完了するまで、ビジー サインを示す静止画像を表示できます。

于 2013-07-24T10:32:30.740 に答える