ResourceDictionary in a separate assembly

.NetWpfXamlControltemplateResourcedictionary

.Net Problem Overview


I have resource dictionary files (MenuTemplate.xaml, ButtonTemplate.xaml, etc) that I want to use in multiple separate applications. I could add them to the applications' assemblies, but it's better if I compile these resources in one single assembly and have my applications reference it, right?

After the resource assembly is built, how can I reference it in the App.xaml of my applications? Currently I use ResourceDictionary.MergedDictionaries to merge the individual dictionary files. If I have them in an assembly, how can I reference them in xaml?

.Net Solutions


Solution 1 - .Net

Check out the pack URI syntax. You want something like this:

<ResourceDictionary Source="pack://application:,,,/YourAssembly;component/Subfolder/YourResourceFile.xaml"/>

Solution 2 - .Net

An example, just to make this a 15 seconds answer -

Say you have "styles.xaml" in a WPF library named "common" and you want to use it from your main application project:

  1. Add a reference from the main project to "common" project
  2. Your app.xaml should contain:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/Common;component/styles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

Solution 3 - .Net

I'm working with .NET 4.5 and couldn't get this working... I was using WPF Custom Control Library. This worked for me in the end...

<ResourceDictionary Source="/MyAssembly;component/mytheme.xaml" />

source: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/11a42336-8d87-4656-91a3-275413d3cc19

Solution 4 - .Net

Resource-Only DLL is an option for you. But it is not required necessarily unless you want to modify resources without recompiling applications. Have just one common ResourceDictionary file is also an option. It depends how often you change resources and etc.

<ResourceDictionary Source="pack://application:,,,/
     <MyAssembly>;component/<FolderStructureInAssembly>/<ResourceFile.xaml>"/>

MyAssembly - Just assembly name without extension

FolderStructureInAssembly - If your resources are in a folde, specify folder structure

When you are doing this it's better to aware of siteOfOrigin as well.

> WPF supports two authorities: application:/// and siteoforigin:///. > The application:/// authority identifies application data files that > are known at compile time, including resource and content files. The > siteoforigin:/// authority identifies site of origin files. The scope > of each authority is shown in the following figure.

enter image description here

Solution 5 - .Net

For UWP:

<ResourceDictionary Source="ms-appx:///##Namespace.External.Assembly##/##FOLDER##/##FILE##.xaml" />

Solution 6 - .Net

Using XAML:

If you know the other assembly structure and want the resources in c# code, then use below code:

 ResourceDictionary dictionary = new ResourceDictionary();
 dictionary.Source = new Uri("pack://application:,,,/WpfControlLibrary1;Component/RD1.xaml", UriKind.Absolute);
 foreach (var item in dictionary.Values)
 {
    //operations
 }

Output: If we want to use ResourceDictionary RD1.xaml of Project WpfControlLibrary1 into StackOverflowApp project.

Structure of Projects:

Structure of Projects

Resource Dictionary: Resource Dictionary

Code Output:

Output

PS: All ResourceDictionary Files should have Build Action as 'Resource' or 'Page'.

Using C#:

> If anyone wants the solution in purely c# code then see my this > solution.

Solution 7 - .Net

I know I will probably go to WPF hell but I like to keep it simple.

In my "external" WPF project named MyCorp.Wpf.Dll where I have a folder called assets with my resource dictionaries

MyCorp.Wpf.Dll
|- Assets
   |- TextStyles.xaml
   |- Colours.axml

Let's assume I have this TextStyles.xaml with the UI font styles that I need to apply because I need windows 10/ 11 style compliance http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Style x:Key="Header" TargetType="TextBlock">
        <Setter Property="FontFamily" Value="Sego UI Light"/>
        <Setter Property="FontSize" Value="46" />
    </Style>
    
    <Style x:Key="Subheader" TargetType="TextBlock">
        <Setter Property="FontFamily" Value="Sego UI Light"/>
        <Setter Property="FontSize" Value="32" />
    </Style>
    <Style x:Key="Title" TargetType="TextBlock">
        <Setter Property="FontFamily" Value="Sego UI SemiLight"/>
        <Setter Property="FontSize" Value="24" />
    </Style>
    <Style x:Key="SubTitle" TargetType="TextBlock">
        <Setter Property="FontFamily" Value="Sego UI Normal"/>
        <Setter Property="FontSize" Value="20" />
    </Style>
    
    <Style x:Key="Base" TargetType="TextBlock">
        <Setter Property="FontFamily" Value="Sego Semibold"/>
        <Setter Property="FontSize" Value="15" />
    </Style>
    <Style x:Key="Body" TargetType="TextBlock">
        <Setter Property="FontFamily" Value="Sego Normal"/>
        <Setter Property="FontSize" Value="15" />
    </Style>
    <Style x:Key="Caption" TargetType="TextBlock">
        <Setter Property="FontFamily" Value="Sego Normal"/>
        <Setter Property="FontSize" Value="12" />
    </Style>   

</ResourceDictionary>

These styles are in my corporate style guide and I am re-sing them al over the place

now in my brand new application I can use the corporate style DLL from an internal NuGet package feed or I link it because It happens to be in my solution using the following resource dictionary

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    >
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/MyCorp.Wpf;component/Assets/TextStyles.xaml"/>
        <ResourceDictionary Source="/MyCorp.Wpf;component/Assets/Styles.xaml"/>
        <ResourceDictionary Source="/MyCorp.Wpf;component/Assets/Brushes.xaml"/>
        <ResourceDictionary Source="/MyCorp.Wpf;component/Assets/ColorStyles.xaml"/>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

I have no clue where the extra component come from, I just know I needed. then in my new application I just link it like so:

<Application x:Class="MyNew.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="ExternalResources.xaml"/>
            </ResourceDictionary.MergedDictionaries>
            
            <BooleanToVisibilityConverter x:Key="VisibilityConverter"/>
        </ResourceDictionary>
    </Application.Resources>
</Application>

This way I have all external links in the ExternalResources.xaml where everyone understands where they came from and updating them is easy

I can then use the external resource definitions like any other in my windows, page and controls

<syncfusion:ChromelessWindow x:Class="IDPS.ChromelessWindow1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:IDPS"
        xmlns:r="clr-namespace:IDPS.Wpf.Properties;assembly=IDPS.Wpf"                     
        xmlns:syncfusion="http://schemas.syncfusion.com/wpf"
        syncfusion:SfSkinManager.Theme="{syncfusion:SkinManagerExtension ThemeName=FluentDark}"
        mc:Ignorable="d"
       MinHeight="450" MinWidth="800">
    <Grid>
        <TextBlock Text="Hello world" Style="{StaticResource Title}"/>
    </Grid>
</syncfusion:ChromelessWindow>

My result

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionGus CavalcantiView Question on Stackoverflow
Solution 1 - .NetKent BoogaartView Answer on Stackoverflow
Solution 2 - .NetHertzel GuinnessView Answer on Stackoverflow
Solution 3 - .NetAleksandar ToplekView Answer on Stackoverflow
Solution 4 - .NetCharithJView Answer on Stackoverflow
Solution 5 - .NetGianluca DemarinisView Answer on Stackoverflow
Solution 6 - .NetKylo RenView Answer on Stackoverflow
Solution 7 - .NetWalter VerhoevenView Answer on Stackoverflow