代码之家  ›  专栏  ›  技术社区  ›  StackOverflowUser

WPF使用来自多个项目的多个资源字典

  •  2
  • StackOverflowUser  · 技术社区  · 7 年前

    项目B.主题

    项目B.Themes使用A.Themes并具有新的样式,一些资源具有A.Themes中已经定义的键。

    A、 主题几乎没有样式文件:

    Brushes.xaml
    Buttons.xaml
    CheckBox.xaml
    

    我们把它们捆起来。Xaml:

    <ResourceDictionary.MergedDictionaries>         
       <ResourceDictionary Source="pack://application:,,,/A.Themes;component/Assets/Brushes.xaml"/>
       <ResourceDictionary Source="pack://application:,,,/A.Themes;component/Assets/Buttons.xaml"/>
       <ResourceDictionary Source="pack://application:,,,/A.Themes;component/Assets/CheckBox.xaml" />
    </ResourceDictionary.MergedDictionaries>
    

    按钮。xaml
    

    <ResourceDictionary.MergedDictionaries>         
       <ResourceDictionary Source="pack://application:,,,/A.Themes;component/Bundle.xaml"/>
       <ResourceDictionary Source="pack://application:,,,/B.Themes;component/Assets/Brushes.xaml"/>
       <ResourceDictionary Source="pack://application:,,,/B.Themes;component/Assets/Buttons.xaml"/>
       <ResourceDictionary Source="pack://application:,,,/B.Themes;component/Assets/CheckBox.xaml" />
    </ResourceDictionary.MergedDictionaries>
    

    在我们的项目中,我们将它们加载到应用程序中。xaml:

    <Application.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="pack://application:,,,/A.Themes;component/Bundle.xaml"/>
                    <ResourceDictionary Source="pack://application:,,,/B.Themes;component/Bundle.xaml"/>
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Application.Resources>
    

    问题是: 1.B.Themes的资源并不总是被占用,我们无法找到原因。 2.如果我删除对A.Themes/Bundle的引用。来自应用程序的xaml。xaml项目无法从A.Themes中找到资源,即使它包含在B.Themes/Bundle中。xaml

    我们参考了B.Themes中的A.Themes项目 并参考主项目中的A.主题和B.主题

    谢谢

    1 回复  |  直到 7 年前
        1
  •  3
  •   mm8    7 年前

    装货顺序和你期望的不太一样。来自MSDN:

    合并字典中的资源在资源查找范围中占据一个位置,该位置恰好位于它们合并到的主资源字典范围之后

    https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/merged-resource-dictionaries

    因此,合并到 Bundle.xaml 组件A的实际加载在其他组件之后。

    https://social.msdn.microsoft.com/Forums/vstudio/en-US/3bea80f9-d1db-4cb7-ae7a-77a02eaf4ec9/resourcedictionary-load-order?forum=wpf