异步加载TabItem

时间:2012-02-07 16:01:49

标签: c# wpf asynchronous

是否可以异步加载tabitems? 在我的情况下,我有一个包含一些tabitems的选项卡控件。 当用户点击一个tabitem时,应用程序会冻结一小段时间,以加载tabitem。

现在我想改变它。当用户点击一个tabitem时,将显示一个动画,在完成加载tabitem后,将显示该tabitem。

有人有想法吗?

1 个答案:

答案 0 :(得分:0)

这取决于需要很长时间才能加载。

如果数据导致暂停,则异步加载数据并在加载数据时显示占位符。数据加载完成后,您可以将其更改为实际内容。

这是一个例子,

<ContentControl>
    <ContentControl.Style>
        <Style TargetType="{x:Type ContentControl}">
            <Setter Property="ContentTemplate" Value="{StaticResource TabContentTemplate}" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsLoading}" Value="True">
                    <Setter Property="ContentTemplate" Value="{StaticResource LoadingTemplate}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>
</ContentControl>

更改RelayCommand的{​​{1}}可能如下所示:

SelectedItem

如果您的UI需要一段时间才能加载,那么用户可能只需要在第一次加载选项卡时处理初始加载时间,但是您可以通过{{切换到已加载的选项卡时停止延迟3}}。

WPF void ChangeTab(ITabViewModel newTab) { // Set loading flag and set tab as Selected newTab.IsLoading = true; SelectedTab = newTab; // Create async task var asyncTask = new Task(() => newTab.LoadData()); // This runs after task is finished running asyncTask.ContinueWith(p => newTab.IsLoading = false)); // Start async task asyncTask.Start(); } 的默认行为是当您切换到其他选项卡并在您返回时重新加载时卸载TabControl。此变通方法存储已加载选项卡的TabItem,并将重新加载已保存的选项卡,而不是在切换回时加载新选项卡。

在大多数情况下,UI延迟是由屏幕上的大量UI元素引起的。尝试并减少选项卡上的元素数量。例如,ContentPresenter包含的元素多于Labels,因此,除非您需要特定于标签的功能,否则请尝试使用TextBlocks代替Labels