我似乎无法将合并字典添加到XAML中的合并字典集合中。
主题.xaml
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Mine;component/Themes/Palette.Blue.xaml"/>
<ResourceDictionary Source="/Mine;component/Themes/Template.xaml"/>
</ResourceDictionary.MergedDictionaries>
应用资源
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Mine;component/Themes/Theme.xaml"/>
<!--
<ResourceDictionary Source=="/Mine;component/Themes/Palette.Blue.xaml"/>
<ResourceDictionary Source="/Mine;component/Themes/Template.xaml"/>
-->
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
注意:如果我把两个ResourceDictionaries都放在Appication.ResourcesMergedDictionary中(注解掉theme.xaml并取消注解其他两个字典),它们都能正确加载。然而,我们的资源定义的方式,这可能意味着相当多的资源将被加载,并且对于动态加载,我希望能够定义模板。
3条答案
按热度按时间xmakbtuz1#
这是一个优化错误,请参阅this link
在XAML中创建每个对象时,如果存在默认样式(即style w/ a key of Type),应该应用该样式。可以想象,有几个性能优化可以使(隐含的)查找尽可能地轻。其中之一是我们不查看资源字典内部,除非它们被标记为“包含默认样式”。有一个bug:如果你所有的默认样式都嵌套在三层(或更深)的合并字典中,那么顶层字典不会被标记,所以搜索会跳过它。解决的办法是在根字典中为某个东西,任何东西设置一个默认样式。
所以在根字典中添加一个dummy样式可以解决这个问题。示例
wkftcu5l2#
您的示例代码在Palette.Blue.xaml的App.xaml合并资源字典源中有一个双等号。我假设这是一个错字为您的例子张贴在这里,而不是你的真实的问题,虽然。
弄清楚如何在XAML中直接链接所有资源可能是一件棘手的事情。最简单的方法是从Blend中的“资源”面板执行此操作。我创建了一个Silverlight应用程序,其中的资源文件与您的示例类似,然后在Blend中打开项目,并很快将它们链接在一起。
App.xaml
主题.xaml
模板.xaml
调色板.蓝色.xaml
MainPage.xaml
当然,如果您链接来自不同程序集的资源,它看起来会有所不同。实际上,在这种情况下,我建议在后面的代码中合并你的字典。
6kkfgxo03#
如果这发生在你自己的控件上,我发现另一种解决方案是将
DefaultStyleKey
属性设置为null:我不知道为什么这样做,但它似乎!