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 一个选项卡时,它都会调用构造函数并重新初始化整个控件。我不确定为什么它不再将选项卡保留在内存中。
有什么方法可以让用户控件在使用此方法初始化后保留在内存中?
如果将 DataTemplate
与 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
事件处理程序或类似的。
我有一个选项卡控件,其中每个选项卡项都是自定义的用户控件。问题是每当程序启动时,每个单独的控件都会被初始化和加载。然后,切换到标签页时,又得重新加载。
我已经更改了标签项的加载方式,如下所示。这可以防止用户控件在被单击之前进行初始化和加载(这是首选):
<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 一个选项卡时,它都会调用构造函数并重新初始化整个控件。我不确定为什么它不再将选项卡保留在内存中。
有什么方法可以让用户控件在使用此方法初始化后保留在内存中?
如果将 DataTemplate
与 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
事件处理程序或类似的。