如果将ResourceDictionary放在ListBox DataTemplate上的UserControl中,是否为每个项加载它?

时间:2017-05-11 14:26:23

标签: c# wpf xaml resourcedictionary

要扩展标题问题,请参阅以下情景:

我们说我有一个UserControl我用于ListBox上一长串项目中的主要文本;每个项目都是ListBox上的DataTemplate,其中包含数十到数千个项目(注意:List当然是虚拟化的。)

在这个UserControl中是对它所需的所有资源字典的引用,或者像X16L那样放在那里:

<ResourceDictionary>
     <ResourceDictionary.MergedDictionaries>
          ~Various other resource dictionaries~
     <ResourceDictionary.MergedDictionaries/>
<ResourceDictionary/>

或者放入用户控件后面的代码,如下所示:

public override void BeginInit()
{
    Resources.MergedDictionaries.Add(new ResourceDictionary().AddResource(~resource dictionary location here~));
    base.BeginInit();
}

每个列表框项中每次加载/初始化其中一个用户控件时,是否会引入这些资源字典,或者编译器是否足够智能以查看它已经具有字典并且会放弃花费资源来一遍又一遍地尝试同样的东西吗?

如果前者是真的,它会减慢多少?

1 个答案:

答案 0 :(得分:2)

所以想想这样,如果你从一个资源字典开始并声明另一个资源字典继承来自MergedDictionaries,那么在运行时它只是将MergedDictionary的副本注入到它声明的那个。

现在,如果你然后在一个实例中说,一个DataTemplate被重复,而不是它重复的每个实例现在都注入了之前的字典,因为DataTemplate就像它自己的小世界。根据使用情况,这很快就会变成一场表演噩梦。

希望这会有所帮助,欢呼。