如果我多次使用MergedDictionaries定义样式,它在运行时不起作用,但在VS2010的WPF Designer中它可以工作.如果在运行时使用代码加载MergedDictionaries,它也可以工作.
为什么会这样?这只是我的问题还是?以及如何解决?
I am using WPF4 and loading themes/styles from an assembly at application level.
Run Code Online (Sandbox Code Playgroud)
不工作
<!--Application.xaml-->
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/Lib;component/Themes/Theme.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
<!--Theme.xaml-->
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Theme/Shared.xaml" />
<ResourceDictionary Source="Theme/Button.xaml" />
</ResourceDictionary.MergedDictionaries>
Run Code Online (Sandbox Code Playgroud)
工作
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/Lib;component/Themes/Theme/Shared.xaml" />
<ResourceDictionary Source="pack://application:,,,/Lib;component/Themes/Theme/Button.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)
看到这个问题的答案.我有一种感觉,你有同样的问题
这是一个优化错误,请参阅此链接
在XAML中创建每个对象时,如果存在默认样式(即具有Type的键的样式),则应该应用该样式.您可以想象,有几种性能优化可以使(隐含)查找尽可能轻量级.其中之一是我们不会查看资源字典,除非它们被标记为"包含默认样式".有一个错误:如果所有默认样式都嵌套在合并的字典中三个级别(或更深),则顶级字典不会被标记,因此搜索会跳过它.解决方法是在根词典中将默认样式放在某个东西上.
因此,在根字典中添加虚拟样式可以解决此问题.例
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/Lib;component/Themes/Theme.xaml" />
</ResourceDictionary.MergedDictionaries>
<!-- Dummy Style, anything you won't use goes -->
<Style TargetType="{x:Type Rectangle}" />
</ResourceDictionary>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)