Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to import one ResourceDictionary into other, in WPF?

Tags:

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

like image 232
snstuff Avatar asked May 10 '12 20:05

snstuff


3 Answers

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

like image 92
Tilak Avatar answered Sep 23 '22 14:09

Tilak


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)

like image 44
Scott Avatar answered Sep 20 '22 14:09

Scott


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.

like image 1
GWLlosa Avatar answered Sep 20 '22 14:09

GWLlosa