How to load a ResourceDictionary at Design Time in WPF
I am including my ResourceDictionary files as Content files. Content files means they are not compiled or embedded, but they are loose files on disk.
One issue I need to solve was how to have the Design View in Expression Blend or Visual Studio.
It seems that Expression Blend has a partial solution but it doesn’t work in Visual Studio for me.
Steps for loading a ResourceDictionary from a loose file at design time
- Locate your .proj file for your WPF Project.
- Edit the .proj file with you favorite text editor.
Note: I use Notepad++. - Find the ResourceDictionary file that is included as content.
<Content Include="Resources\en-US\Common.View.LocalizationResources.en-US.xaml"> <Generator>MSBuild:Compile</Generator> <SubType>Designer</SubType> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content>
- Change it to this:
<Content Include="Resources\en-US\Common.View.LocalizationResources.en-US.xaml" Condition="'$(DesignTime)'=='true' OR ('$(SolutionPath)'!='' AND Exists('$(SolutionPath)') AND '$(BuildingInsideVisualStudio)'!='true' AND '$(BuildingInsideExpressionBlend)'!='true')"> <Generator>MSBuild:Compile</Generator> <SubType>Designer</SubType> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content>
- Save and close the file.
Loading multiple ResourceDictionary files at design time
Sometimes Expression Blend will prompt you when it can’t find a resource and it will do this for you. However, it does something interesting.
It adds a file called DesignTimeResources.xaml in the Properties folder as a Page (not as Content).
<Page Include="Properties\DesignTimeResources.xaml" Condition="'$(DesignTime)'=='true' OR ('$(SolutionPath)'!='' AND Exists('$(SolutionPath)') AND '$(BuildingInsideVisualStudio)'!='true' AND '$(BuildingInsideExpressionBlend)'!='true')"> <Generator>MSBuild:Compile</Generator> <SubType>Designer</SubType> <ContainsDesignTimeResources>true</ContainsDesignTimeResources> </Page>
The file then looks as follows:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="E:\Dev\LD\Trunk\install\Common\LANDesk.Install.Common\Resources\en-US\Common.LocalizationResources.en-US.xaml"/> </ResourceDictionary.MergedDictionaries> <!-- Resource dictionary entries should be defined here. --> </ResourceDictionary>
And then you can add more ResourceDictionaries without modifying the .proj file.
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="E:\Dev\LD\Trunk\install\SomeApp\Branding\StyleResources.xaml"/> <ResourceDictionary Source="E:\Dev\LD\Trunk\install\SomeApp\Branding\AlternateStyleResources.xaml"/> <ResourceDictionary Source="E:\Dev\LD\Trunk\install\SomeApp\Resources\en-US\en-US.xaml"/> </ResourceDictionary.MergedDictionaries> <!-- Resource dictionary entries should be defined here. --> </ResourceDictionary>
ResourceDictionary with Relative Paths
Of course relative paths are more desired than static paths, especially when using projects among multiple people and from source control.
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="..\Branding\StyleResources.xaml"/> <ResourceDictionary Source="..\Branding\AlternateStyleResources.xaml"/> <ResourceDictionary Source="..\Resources\en-US\en-US.xaml"/> </ResourceDictionary.MergedDictionaries> <!-- Resource dictionary entries should be defined here. --> </ResourceDictionary>
Resources:
http://www.tweened.org/en/2010/06/07/design-time-resources-dans-blend-4/
Hi,
Were you able to get design-time data to load in Visual Studio? I’ve tried your method and nothing shows up 🙁
Thanks,
-Frank
No, it seems to only work in Expression Blend. I researched for a while and read at least one MS site that claimed it should work in VS, too, but I have never been able to get it to work…I haven’t checked VS 2012.
However, in Expression Blend, I got relative paths to work. You need to use “../”.