异步加载TabItem
本文关键字:TabItem 加载 异步 | 更新日期: 2023-09-27 18:22:48
是否可以异步加载选项卡项?在我的例子中,我有一个选项卡控件,其中包含一些选项卡项。当用户单击一个选项卡项时,应用程序会冻结一小段时间,以加载该选项卡项。
现在我想改变这一点。当用户点击一个选项卡项时,将显示一个动画,在该选项卡项完全加载后,将显示该选项卡项。
有人知道吗?
这取决于加载需要很长时间。
如果数据导致暂停,则异步加载数据,并在加载数据时显示占位符。数据加载完成后,您可以将其更改为实际内容。
这里有一个例子,
<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>
改变SelectedItem
的RelayCommand
可能看起来像这样:
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();
}
如果是你的UI需要一段时间才能加载,那么用户可能只需要在第一次加载选项卡时处理初始加载时间,但是,当切换到已经加载的选项卡时,你可以通过扩展TabControl来阻止延迟,以防止它去存储它的TabItems。
WPF的TabControl
的默认行为是在切换到其他选项卡时卸载TabItem
,并在返回时重新加载它。此解决方法存储已加载选项卡的ContentPresenter
,并将在切换回时重新加载保存的选项卡,而不是加载新选项卡。
在大多数情况下,UI延迟是由屏幕上大量的UI元素引起的。尽量减少选项卡上的元素数量。例如,Labels
包含的元素比TextBlocks
多,因此除非您需要特定于标签的功能(如选择),否则请尝试使用Labels
而不是TextBlocks