当使用多个MergedDictionaries时,为什么样式在运行时在wpf中不起作用?

时间:2011-02-20 13:12:25

标签: wpf xaml

如果我多次使用MergedDictionaries定义样式,它在运行时不起作用,但在VS2010的WPF Designer中它可以工作。如果在运行时使用代码加载MergedDictionaries,它也可以工作。

为什么会这样?这只是我的问题还是?以及如何解决?

I am using WPF4 and loading themes/styles from an assembly at application level.

无法正常工作

<!--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>

工作

<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>

1 个答案:

答案 0 :(得分:9)

查看this question的答案。我有一种感觉,你有同样的问题

这是一个优化错误,请参阅this link

  

关于创建每个对象   XAML,如果存在默认样式   (即具有类型的键的样式)   风格应该适用。尽你所能   想象有几个表现   优化(隐含)   查找尽可能轻的重量。一   他们是我们不看里面   资源字典除非它们是   标记为“包含默认值   样式”。有一个错误:如果你所有的   默认样式嵌套在合并中   字典深入三层(或   更深层次的顶级词典没有   得到标记,以便搜索跳过它。   解决方法是设置默认值   风格的东西,任何东西,在   根词典。

因此,在根字典中添加虚拟样式可以解决此问题。实施例

<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>