我有运行时所创建的选项卡的标签控制。选项卡的内容将是若干用户控制一个,每个包含数以百计的其他控件。因为它需要很长的时间来创建这些用户控件,我试图找到一种方法,重用他们,而不是为每个标签创建一个新的实例。
我使用一个DataTemplate如下设置标签页的内容:
<DataTemplate>
<ScrollViewer Content="{Binding Content}" />
</DataTemplate>
其中的内容是我想要的标签,以显示视图的视图模型。
别处我用数据模板到每个视图模型映射到的图,例如
<DataTemplate DataType="{x:Type vm:MyViewModel1}">
<ctl:CacheContentControl ContentType="{x:Type ctl:MyView1}" />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:MyViewModel2}">
<ctl:CacheContentControl ContentType="{x:Type ctl:MyView2}" />
</DataTemplate>
CacheContentControl是围绕ContentControl中,我使用了缓存的包装:
public class CacheContentControl : ContentControl
{
private static Dictionary<Type, Control> cache = new Dictionary<Type, Control>();
public CacheContentControl()
{
Unloaded += CacheContentControl_Unloaded;
}
private void CacheContentControl_Unloaded(object sender, RoutedEventArgs e)
{
Content = null;
}
private Type _contentType;
public Type ContentType
{
get { return _contentType; }
set
{
_contentType = value;
Content = GetView(_contentType);
}
}
public Control GetView(Type type)
{
if (!cache.ContainsKey(type))
{
cache.Add(type, (Control)Activator.CreateInstance(type));
}
return cache[type];
}
}
这确保了DataTemplate中首先检查高速缓存,看看它是否能创造一个新实例之前,重新使用控制。
这适用于创建的任何新的选项卡。第一个选项卡是缓慢的预期,因为它需要创建初始的控制,但几乎马上用同一个控制系统负载的所有后续标签。我遇到的问题是,当我点击回到上一个选项卡控件不再出现,选项卡为空。
我想这种情况正在发生,因为我不能表现出同样的形式多次这是有意义的在同一个控件实例。我已经能够用人工的IsVisibleChanged在事件我CacheContentControl如下解决它:
private void CacheContentControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if (IsVisible && ContentType != null)
{
Control ctl = GetView(_contentType);
ctl.DataContext = DataContext;
Content = ctl;
}
else
{
Content = null;
}
}
当标签失去焦点它消除了控制,接收焦点就可以检索从中似乎工作缓存控制选项卡。
问题是,速度已经回到再次是慢,我不知道为什么。显然,这是可以控制的实例从一个选项卡移动到另一个毫不拖延地为它创建一个新的标签每次都是这样。一定有什么东西在DataTemplate中做不同的改变控件的父?
我不知道你需要这么远,缓存用户控件WPF主要是做这行你走。
按类型键入一个DataTemplate内的一般做法是不使用ContentControl中,而只是有用户控件作为模板。
<DataTemplate x:Key=“MyViewmodelType”>
<MyViewControl />
</DataTemplate>
该TabControl的将有它的内容设置为取其视图模型是适用的,WPF将使用指定的DataTemplate该类型自动呈现并设置DataContext的一个ContentControl中。
我已经建立了使用的DataTemplates按照上述的简单的方法呈现巨大的WPF浏览没有遇到任何严重的性能问题,我认为,你可以放心地开始通过简单地结合ContentControl.Content你的视图模型的实例,让使用WPF处理渲染发展以上简单的DataTemplate的方法。