我目前正在制作可以动态应用于我的应用程序的样式和模板字典。在这个“新想要的”动态行为之前,我有几个资源字典,每个样式控件一个,我在App.xaml中合并:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="ColorsDictionary.xaml"/>
<ResourceDictionary Source="ControlsTemplatesDictionary.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
现在,我希望我的应用程序可以设置样式,所以我决定将以前的所有资源合并到一个名为“MyFirstTemplates”的新资源中,并将此字典添加到App.xaml。
新词典“MyFirstTemplates.xaml”:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">"
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="ColorsDictionary.xaml"/>
<ResourceDictionary Source="ControlsTemplatesDictionary.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
新App.xaml:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="MyFirstTemplates.xaml"/>
</ResourceDictionary.MergedDictionaries>
<Style TargetType="{x:Type Window}"/>
</ResourceDictionary>
</Application.Resources>
注意: Window 的默认样式是更正WPF 4的错误,请参阅Adding a Merged Dictionary to a Merged Dictionary
现在我已经进行了此更改,我不能再将“ColorsDictionary.xaml”中的颜色资源用作“ControlsTemplateDictionary.xaml”中的 StaticResource 。如果我改回到在app.xaml中合并这些文件,一切正常。为了使其工作,我必须为 DynamicResource 更改这些 StaticResource 。你知道为什么它不再起作用吗?
谢谢: - )
答案 0 :(得分:9)
通过将字典移出App.xaml,在加载MyFirstTemplates.xaml期间,每个字典中的资源不在另一个字典中。您的原始设置首先加载了ColorsDictionary,然后在加载时通过App资源提供给ControlsTemplatesDictionary。在你的新设置中,为了使颜色资源在App资源中可用,它需要通过MyFirstTemplates加载,这反过来又需要加载两个字典,这反过来需要访问颜色资源...所以它的类型无限循环的引用,无法静态解析。 DynamicResource可以等到所有内容都加载完毕后再访问颜色。
要修复使用Dynamic或将ColorsDictionary直接合并到ControlsTemplatesDictionary。
答案 1 :(得分:2)
John解释为什么会这样。 所以问题是当在合并字典中使用合并字典时,内部字典不能使用&#34;使用&#34;彼此为StaticResource。
基本解决方案:
这两种解决方案都存在问题。 DynamicResource存在性能问题。第二种解决方案限制了您组织XAML资源的方式。
替代解决方案:
我创建了一个小的简单程序(在GitHub中提供),它将作为预构建事件运行,并将文件夹中的XAML文件合并到一个长.XAML文件中。好吧,他们需要使用不同的扩展名(.txaml),否则他们将被编译。
这允许根据需要构建资源文件夹和文件,而不受WPF的限制。 StaticResource和设计师将一直工作。
The code in GitHub包含一个包含合并程序的简单解决方案。它将2个文件夹合并为2个文件。一个用于App.xaml资源,另一个用于Generic.xaml资源。 &#34;控件&#34;中的.xaml文件项目(还有&#34; Main&#34;项目)。