【问题标题】:TabControl - Keeping UserControl TabItems in Memory When Switching TabsTabControl - 切换选项卡时将 UserControl TabItems 保留在内存中
【发布时间】:2021-12-27 16:52:19
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: c# wpf tabs user-controls contenttemplate


    【解决方案1】:

    如果您将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 事件处理程序或类似的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 2020-10-29
      相关资源
      最近更新 更多