Putting resource in separate xaml files
In Silverlight, we usually define several shared resources (i.e. definition of Color, Brush, Style, etc) in an individual xaml file (i.e. inside <UserControl.Resources></UserControl.Resources>, which scope is local to that file only) or in the App.xaml file (i.e. inside <Application.Resources></Application.Resources>, which scope is global to the app). The latter approach is good way to share resources but it can easily make the App.xaml file becomes huge. Another approach is to put the resources in one or more xaml files, which can be loaded at runtime.
For example, our app has a button control on the page, the xaml code looks something like:
<
Button x:Name="MyButton" Content="My Sample Button" />
We want to assign one of the button properties with resource we load externally. Following are steps to create the separate xaml resource file and use the resources in the app:
- Create an empty xaml file (i.e. let's name it MyResources.xaml) and add it to the Silverlight project
- Change the Build Action property of the file from "None" or "Page" to "Content"
- Put the resource dictionary definition in the xaml file, for example:
<ResourceDictionary
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml">
<SolidColorBrush x:Name="RedColorBrush"
Color="Red"
/>
</ResourceDictionary>
Then add following code to load the resource dictionary and use the brush object on the existing button:
// Read resources.xaml included in the project
string xaml = null;
StreamResourceInfo sri = Application.GetResourceStream(new Uri("MyResources.xaml", UriKind.Relative));
using (StreamReader reader = new StreamReader(sri.Stream))
{
xaml = reader.ReadToEnd();
}
// Load the resource dictionary and access the resource using key
if (xaml != null)
{
_globalResources = (ResourceDictionary)XamlReader.Load(xaml);
// Now we can use the resource defined in the dictionary
SolidColorBrush redColorBrush = (SolidColorBrush) _globalResources ["RedColorBrush"];
MyButton.Background = redColorBrush;
}
Comments
Anonymous
November 30, 2008
PingBack from http://blog.a-foton.ru/index.php/2008/12/01/putting-resource-in-separate-xaml-files/Anonymous
November 30, 2008
like WPF, why can't we have a resource collection kind of entry in app.xaml and map to all resource files? this approach, is anyway same as what is followed when theming SL applicationsAnonymous
December 01, 2008
Silverlight doesn't support merged dictionaries. Which is a shame, really...