TabControl - 切换选项卡时将 UserControl TabItems 保留在内存中

TabControl - Keeping UserControl TabItems in Memory When Switching Tabs

我有一个选项卡控件,其中每个选项卡项都是自定义的用户控件。问题是每当程序启动时,每个单独的控件都会被初始化和加载。然后,切换到标签页时,又得重新加载。

我已经更改了标签项的加载方式,如下所示。这可以防止用户控件在被单击之前进行初始化和加载(这是首选):

<TabControl>
  <TabItem>
      <TabItem.ContentTemplate>
          <DataTemplate>
              <local:ctlHome />
          </DataTemplate>
      </TabItem.ContentTemplate>
  </TabItem>
  <TabItem>
      <TabItem.ContentTemplate>
          <DataTemplate>
              <local:ctlTwo />
          </DataTemplate>
      </TabItem.ContentTemplate>
  </TabItem>
  ...
</TabControl>

当我第一次推出它时,每次我切换到新标签时,它都会调用 构造函数 -> 卸载上一个标签 -> 加载新标签,这很棒。它只会调用一次构造函数,每当我重新select编辑选项卡时,它只会按预期 unload -> load

现在,每次我 select 一个选项卡时,它都会调用构造函数并重新初始化整个控件。我不确定为什么它不再将选项卡保留在内存中。

有什么方法可以让用户控件在使用此方法初始化后保留在内存中?

如果将 DataTemplateContentControl 一起使用,只有最初可见的控件会 加载 :

<TabControl xmlns:s="clr-namespace:System;assembly=mscorlib">
    <TabControl.Items>
        <s:String>home</s:String>
        <s:String>two</s:String>
    </TabControl.Items>
    <TabControl.ContentTemplate>
        <DataTemplate>
            <ContentControl>
                <ContentControl.Style>
                    <Style TargetType="ContentControl">
                        <Setter Property="Content">
                            <Setter.Value>
                                <local:ctlHome />
                            </Setter.Value>
                        </Setter>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding}" Value="two">
                                <Setter Property="Content">
                                    <Setter.Value>
                                        <local:ctlTwo />
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </ContentControl.Style>
            </ContentControl>
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

虽然两个控件都立即初始化,但这应该不是问题,因为您不应该在构造函数中执行任何繁重的操作。将任何初始化逻辑移动到 Loaded 事件处理程序或类似的。