簡體   English   中英

WPF BusyIndi​​cator在后台線程上

[英]WPF BusyIndicator on a background thread

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

我不相信你可以做到。 您無法從后台線程訪問UI控件。 另外,您可能會發現正是UI線程忙於渲染或通知進度條並使其凍結。

我在大型WPF應用程序中具有類似的設置,並且遇到相同的問題。 從數據庫中獲取數據時,忙碌指示器顯示正常,但是當應用程序開始在UI中呈現數據時,忙碌指示器凍結。

我什至嘗試使用動畫Gif來解決此問題,但是當然,它們在WPF應用程序中不會(單獨)設置動畫。 編寫了用於在Gif中對幀進行動畫處理的代碼后,我很失望地發現它也遇到了相同的問題。

祝你好運。

不,當UI正在更新/使用背景線程之類的東西時,無法顯示BusyIndi​​cator動畫。

請參閱此處的相關文章。 長WPF界面繪制操作期間的忙碌指示器

您可以顯示一些靜態圖像來指示繁忙的信號,直到完成UI更新為止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM