在选项卡之间切换时遇到WPF选项卡控件中的延迟(每次切换选项卡时都会创建新的视图实例)

时间:2014-04-23 18:41:02

标签: wpf mvvm tabcontrol

我是WPF的初学者,我在编码时需要做很多学习,所以请耐心等待。我搜索了档案,但找不到符合我问题的答案。

我目前有一个包含选项卡控件的视图,该控件最初加载了2个默认选项卡,然后根据用户操作以编程方式添加和删除其他选项卡。

我这样做的方法是为我可以添加和删除的不同类型的视图提供一个可观察的ViewModel集合。

在我的Xaml视图中,我有一些不同的DataTemplates,用于确定要加载的视图类型。

我面临的问题是,当我从一个标签点击另一个标签时,我看到一个滞后 - 接近一秒。我在视图后面的代码中添加了一个断点,并注意到每次单击该选项卡时都会为视图调用InitializeComponent()方法。

ViewModels集合名为ActiveContents,其中包含ActiveContent类型的项目。 ActiveContent类是我创建的类,它包含一个名为ContentItem的对象,它将保存ViewModel。

以下是我项目中的一些代码:

xaml的一个数据模板:

<UserControl.Resources>
    <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
        .
        .
        .
            </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>

        <DataTemplate DataType="{x:Type viewmodels:InstallQueueViewModel}">
            <local:InstallQueueView DataContext="{Binding Path=DataContext.InstallQueueVM, 
                RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
        </DataTemplate>
    .
    .
    .
        <DataTemplate x:Key="DataTemplateTabControlContent">
            <ContentControl Content="{Binding ContentItem}"></ContentControl>
        </DataTemplate>
</UserControl.Resources>

<Grid>
    <TabControl ItemsSource="{Binding ActiveContents}"
                SelectedIndex="{Binding SelectedTab, Mode=TwoWay}"
                IsSynchronizedWithCurrentItem="True"
                ItemContainerStyle="{DynamicResource TabItemContainerStyleSpacedMedium}"
                ItemTemplate="{StaticResource DataTemplateTabControlHeader}"
                ContentTemplate="{StaticResource DataTemplateTabControlContent}">
    </TabControl>

有没有办法阻止它每次都加载一个新的视图实例?就像我说的,这是我第一次,所以我完全有可能以错误的方式解决这个问题 - 如果我要改变我的做法,请告诉我。

我想我应该提到的一件事是,我正在使用MahApps来获得应用程序的Metro感觉。我不确定这对我所看到的滞后是否有贡献。

我主要在切换到包含DataGrid的视图时看到滞后。我正在考虑将其更改为ListView,因为数据是只读的,我希望这会给我一些改进,但根本原因仍然无法解决。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:5)

对于一个项目来说,这对我来说是个大问题,我最终创建了一个扩展的TabControl,可以在切换标签时保存每个ContentPresenter的{​​{1}},并在重新加载时重新加载你回到标签页。

代码的原始版本来自here,或者您可以在此问题的相关问题中找到我的代码版本:WPF TabControl - Preventing Unload on Tab Change?

TabItem