我有一个选项卡控件,其中每个选项卡项都是自定义的用户控件。问题是,每当程序启动时,每个单独的控件都会被初始化和加载。然后,当切换到选项卡时,它将不得不再次重新加载。
此后,我更改了选项卡项的加载方式,如下所示。这可以防止用户控件在点击之前进行初始化和加载(这是首选(:
<TabControl>
<TabItem>
<TabItem.ContentTemplate>
<DataTemplate>
<local:ctlHome />
</DataTemplate>
</TabItem.ContentTemplate>
</TabItem>
<TabItem>
<TabItem.ContentTemplate>
<DataTemplate>
<local:ctlTwo />
</DataTemplate>
</TabItem.ContentTemplate>
</TabItem>
...
</TabControl>
当我第一次推出它时,每次我切换到一个新的选项卡时,它都会调用构造函数->卸载上一个选项卡->加载新选项卡,这非常棒。它只会调用构造函数一次,每当我重新选择选项卡时,它就会unload->按预期加载。
现在,每次我选择一个选项卡时,它都会调用构造函数并重新初始化整个控件。我不知道为什么它不再把账单记在记忆里了。
有没有什么方法可以在用户控件使用此方法初始化后将其保存在内存中?
如果将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
事件处理程序或类似程序。