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