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

Cod*_*987 4 wpf xaml

如果我多次使用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)

Fre*_*lad 9

看到这个问题的答案.我有一种感觉,你有同样的问题

这是一个优化错误,请参阅此链接

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