【问题标题】:If ResourceDictionary is placed inside a UserControl that's on a ListBox DataTemplate, does it load it for each item?如果 ResourceDictionary 放置在 ListBox DataTemplate 上的 UserControl 内,它会为每个项目加载它吗?
【发布时间】:2017-10-10 14:59:14
【问题描述】:

为了扩展标题问题,以下是场景:

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

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

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

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

【问题讨论】:

  • 将一些对象放入其中一个字典并计算它被实例化的频率。

标签: c# wpf xaml resourcedictionary


【解决方案1】:

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

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

希望这会有所帮助,干杯。

【讨论】:

  • 这是否意味着在 app.xaml 中的合并字典中声明所有样式会降低性能密集度,还是会占用太多内存,立即加载一个庞大的字典?
  • 如果经常使用它们,则将它们放入应用程序资源中,即 app.xaml,但又有些实例是不同的,因此在没有看到总体要求和正在使用的内容的情况下,很难给出 100% 的最佳实践建议。人们已经在野外制作了一些工具来帮助减轻 wpf 中的复制或 dicts 等问题,但我必须再次找到它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-23
  • 1970-01-01
  • 2013-07-07
  • 2019-01-08
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多