Introducción

Otra característica nueva en Silverlight 3 Beta 1, tomada de su hermano mayor WPF son los Diccionarios de Recursos de tipo Merged (mezclados, unidos), o en inglés: Merged Resource Dictionaries; los cuales nos permiten tener de manera desacoplada recursos (por ejemplo estilos) en un archivo por separado.  Esto nos ofrece un mecanismo para compartir estilos entre diferentes proyectos de Silverlight, o incluso entre proyectos de Silverlight y proyectos de WPF.

El archivo deberá tener declarado todos y cada uno de los Recursos que deseamos incorporar a ese diccionario, y deberán estar contenidos en un elemento de tipo <ResourceDictionary>.  El siguiente fragmento de código Xaml muestra un archivo llamado Estilos.xaml que funge como Diccionario de Recursos:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
    <Style x:Name="estiloBase" TargetType="Shape">
        <Setter Property="Width" Value="50" />
        <Setter Property="Height" Value="50" />
        <Setter Property="Fill" Value="Red" />
        <Setter Property="Stroke" Value="Gold" />
        <Setter Property="StrokeThickness" Value="5" />
        <Setter Property="Margin" Value="5" />
    </Style>
    <Style x:Name="estiloRectangulo" BasedOn="{StaticResource estiloBase}" TargetType="Rectangle">
        <Setter Property="RadiusX" Value="10" />
        <Setter Property="RadiusY" Value="10" />
    </Style>
</ResourceDictionary>

Noten cómo el elemento <ResourceDictionary> incluye los espacios de nombre xml, esto para poder resolver de manera correcta los elementos que agreguemos como Recursos en el Diccionario.

Por otro lado, para invocar ese Diccionario desde algún Diccionario de Recursos (UserControl, Application o algún contenedor) tenemos que hacerlo a través del elemento <ResourceDictionary> lo cual veremos más adelante en este mismo artículo.

Ahora bien, el archivo que contenga el Diccionario de Recursos podrá tener cualquier nombre arbitrario, pero lo que es un hecho es que el XAP aún necesitará referenciarlo de alguna manera:

  • Agregándolo como archivo en el proyecto de Silverlight y marcarlo como Resource
  • Agregándolo como archivo en el proyecto de Silverlight y marcarlo como Content
  • Tenerlo en un Ensamblado externo

Cada opción afecta la sintaxis con la que invocaremos el Diccionario de Recursos.

Build Action = Resource

Cuando marcamos un archivo como Resource en un proyecto de Silverlight, dicho archivo se incluirá en el diccionario de Recursos del Ensamblado.  Este mecanismo es conveniente cuando queremos tener una experiencia WYSIWYG en el diseño de la aplicación, ya que Visual Studio resolverá de manera inmediata el archivo.

Si utilizamos esta opción para el archivo con el Diccionario de Recursos, entonces la sintaxis en Xaml para referenciar los recursos que contiene deberá de ser de la manera:

nombre del ensamblado;component/nombre del archivo.xaml

El siguiente ejemplo de código muestra esta sintaxis al invocar el Diccionario:

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="SilverlightApplication22;component/Estilos.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

Build Action = Content

Si marcamos el archivo como Content, el archivo formará parte del empaquetado XAP como tal, y ya no del Diccionario de Recursos del Ensamblado como mencionamos con anterioridad.

Si utilizamos esta opción, la sintaxis para referenciar el archivo del Diccionario de Recursos será:

/Nombre del archivo.xaml

Por ejemplo:

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Estilos.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

Pero en este caso Visual Studio tendrá un comportamiento inesperado ya que no podremos ver el diseñador correctamente sino hasta ejecutar la aplicación como tal.

Diccionario de Recursos Merged en otro Ensamblado

Para usar un Diccionario de Recursos que está en otro Ensamblado, necesitamos primeramente referenciar el .dll en cuestión y posteriormente utilizar la misma sintaxis que vimos cuando el archivo está marcado como Resource en el mismo proyecto (sección “Build Action=Resource” en este mismo artículo).  Cabe mencionar que en este caso también el archivo deberá estar marcado como Resource en el Ensamblado externo.

Resumen

Los Merged Resource Dictionaries nos permiten crear una lista de recursos en un archivo para poderlos reutilizar entre diferentes proyectos de Silverlight o incluso entre un proyecto de Silverlight y uno de WPF ya que brindan un mecanismo de fácil implementación y desacoplamiento.