如果 ResourceDictionary 放置在 ListBox DataTemplate 上的 UserControl 内,它是否会为每个项目加载它?

If ResourceDictionary is placed inside a UserControl that's on a ListBox DataTemplate, does it load it for each item?

为了扩展标题问题,这里是场景:

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

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

<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();
}

每次这些用户控件之一在每个列表框项中 loaded/initialized 时,这些资源字典是否会被引入,或者是编译器足够聪明,可以看到它已经有了字典,并且会放弃花费资源来一遍又一遍地尝试获取相同的东西吗?

如果前者为真,它会减慢多少速度?

所以这样想,如果您从一个资源字典开始并声明另一个资源字典以通过 MergedDictionaries 继承,那么在运行时它实际上只是将该 MergedDictionary 的副本注入到它在其中声明的字典中。

现在,如果您在一个重复的 DataTemplate 实例中使用它,那么它的每个重复实例现在都会将之前的字典注入其中,因为 DataTemplate 就像它自己的小世界。根据使用情况,这很快就会成为性能噩梦。

希望这对您有所帮助,干杯。