How to import one ResourceDictionary into other, in WPF?

前端 未结 3 1569
醉梦人生
醉梦人生 2021-02-07 00:54

Is it possible to add one resource dictionary into other one?

相关标签:
3条回答
  • 2021-02-07 01:12

    In Dictionary2.xaml define MergedDictionaries (right after the opening ResourceDictionary tag):

    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/Path/to/Dictionary1.xaml" />
    </ResourceDictionary.MergedDictionaries>
    

    there's a catch: each time you merge dictionaries you effectively create a copy of the merged dictionary. And it's recursive - if you have Dict3.xaml and Dict4.xaml that both load Dictionary2.xaml, you will have three instances of Dictionary1.xaml created

    The solution is a SharedResourceDictionary. The implementation in the tutorial should be seen as a starting point and will probably need some level of tweaking - depending on use scenario. Google "wpf SharedResourceDictionary" for some gotchas and solutions.

    From answer to this question by XAMeLi

    0 讨论(0)
  • 2021-02-07 01:30

    A snippet straight from a sketchflow project I am working on that shows how to merge resource dictionaries in xaml:

    <Application.Resources>
        <!-- Resources scoped at the Application level should be defined here. -->
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/Microsoft.Expression.Prototyping.SketchControls;component/ScrollViewerStyles.xaml"/>
                <ResourceDictionary Source="/[ProjectABC];component/[fileXYZ].xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
    

    This shows merging two additional resource dictionaries into another resource dictionary.

    (Note that the order can become important if you have default styles defined in more than one place as they will override each other)

    0 讨论(0)
  • 2021-02-07 01:36

    Something like:

    ResourceDictionary resources = new ResourceDictionary();
    resources.Source = new Uri("/MyModule;component/MyModule.xaml", 
         UriKind.RelativeOrAbsolute);
    Application.Current.Resources.MergedDictionaries.Add(resources);
    

    Might be what you're looking for. We use code like this in our Prism Modules.

    0 讨论(0)
提交回复
热议问题