1

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

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

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

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

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

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

4

1 回答 1

1

如果将 aDataTemplate与 a 一起使用,则只会加载ContentControl最初可见的控件:

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

于 2021-11-17T19:47:08.037 回答