Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果ResourceDictionary放在用户控件中,则';在ListBox数据模板上,是否为每个项目加载它?_C#_Wpf_Xaml_Resourcedictionary - Fatal编程技术网

C# 如果ResourceDictionary放在用户控件中,则';在ListBox数据模板上,是否为每个项目加载它?

C# 如果ResourceDictionary放在用户控件中,则';在ListBox数据模板上,是否为每个项目加载它?,c#,wpf,xaml,resourcedictionary,C#,Wpf,Xaml,Resourcedictionary,要展开标题问题,以下是场景: 假设我有一个UserControl,用于列表框中一长串项目的主文本;每个项目都是列表框上的一个数据模板,包含数十到数千个项目(注意:列表当然是虚拟化的) 在这个UserControl中是对它所需的所有资源字典的引用,或者放在XAML中,如下所示: <ResourceDictionary> <ResourceDictionary.MergedDictionaries> ~Various other resource

要展开标题问题,以下是场景:

假设我有一个UserControl,用于列表框中一长串项目的主文本;每个项目都是列表框上的一个数据模板,包含数十到数千个项目(注意:列表当然是虚拟化的)

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

<ResourceDictionary>
     <ResourceDictionary.MergedDictionaries>
          ~Various other resource dictionaries~
     <ResourceDictionary.MergedDictionaries/>
<ResourceDictionary/>
是否每次在每个列表框项中加载/初始化这些用户控件时都会引入这些资源字典,或者编译器是否足够聪明,可以看到它已经拥有了字典,并且会放弃花费资源来反复尝试获取相同的内容


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

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

现在,如果你在一个实例中,比如说一个数据模板被重复,那么它的每个重复实例现在都注入了之前的字典,因为一个数据模板就像它自己的小世界。这可能会很快成为性能噩梦,具体取决于使用情况


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

在其中一个字典中放入一些对象,并计算它的实例化频率。这是否意味着在app.xaml中的合并字典中声明所有样式会降低性能要求,还是会占用太多内存,立即加载一个大型词典?如果经常使用它们,请将它们放入应用程序资源(又称app.xaml)中,但有些实例是不同的,因此如果看不到总体需求和使用的内容,很难给出100%的最佳实践建议。人们在野外制作了一些工具来帮助缓解wpf中的复制或口述等问题,但我必须再次找到它们。
public override void BeginInit()
{
    Resources.MergedDictionaries.Add(new ResourceDictionary().AddResource(~resource dictionary location here~));
    base.BeginInit();
}