Diccionarios de recursos combinados

Actualización: noviembre 2007

Los recursos de Windows Presentation Foundation (WPF) admiten los diccionarios de recursos combinados. Esta característica proporciona una manera de definir la parte correspondiente a los recursos de una aplicación de WPF fuera de la aplicación de XAML compilada. Así, los recursos se pueden compartir entre las aplicaciones y también quedan aislados de un modo más cómodo para su localización.

Introducción de un diccionario de recursos combinado

En el marcado, se utiliza la sintaxis siguiente para introducir un diccionario de recursos combinado en una página:

<Page.Resources>
  <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
      <ResourceDictionary Source="myresourcedictionary.xaml"/>
      <ResourceDictionary Source="myresourcedictionary2.xaml"/>
    </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
</Page.Resources>

Observe que el elemento ResourceDictionary no tiene x:Key (atributo), que generalmente se requiere para todos los elementos en una colección de recursos. Sin embargo, otra referencia a ResourceDictionary dentro de la colección MergedDictionaries constituye un caso especial, reservado para este escenario de diccionario de recursos combinado. El objeto ResourceDictionary que introduce un diccionario de recursos combinado no puede tener x:Key (atributo). Normalmente, cada objeto ResourceDictionary de la colección MergedDictionaries especifica un atributo Source. El valor de Source debe ser un identificador de recursos uniforme (URI) que se resuelve como la ubicación del archivo de recursos que se va a combinar. El destino de ese URI debe ser otro archivo XAML, cuyo elemento raíz es ResourceDictionary.

Nota

Es válido definir recursos dentro de un objeto ResourceDictionary especificado como diccionario combinado, ya sea como alternativa a especificar la propiedad Source, o bien además de los recursos incluidos desde el origen especificado. Sin embargo, éste no es un escenario común; el escenario principal para los diccionarios combinados es combinar recursos procedentes de ubicaciones de archivo externas. Si desea especificar los recursos dentro del marcado de una página, deberá definirlos en el objeto ResourceDictionary principal, y no en los diccionarios combinados.

Comportamiento de los diccionarios combinados

Los recursos de un diccionario combinado ocupan una ubicación en el ámbito de búsqueda de recursos que se encuentra justo después del ámbito del diccionario de recursos principal con el que se combinan. Aunque una clave de recurso debe ser única dentro de cualquier diccionario individual, una clave puede existir varias veces en un conjunto de diccionarios combinados. En este caso, el recurso que se devuelve procederá del último diccionario situado secuencialmente en la colección MergedDictionaries. Si la colección MergedDictionaries se ha definido en XAML, entonces el orden de los diccionarios combinados de la colección es el orden de los elementos que se indica en el marcado. Si una clave está definida en el diccionario principal y también en un diccionario que se ha combinado, entonces el recurso que se devuelve procederá del diccionario principal. Estas reglas de ámbito se aplican igualmente para referencias de recursos estáticos y referencias de recursos dinámicos.

Diccionarios combinados y código

Los diccionarios combinados se pueden agregar a un diccionario Resources mediante código. El objeto ResourceDictionary predeterminado inicialmente vacío que existe para cualquier propiedad Resources también tiene una propiedad de colección MergedDictionaries predeterminada inicialmente vacía. Para agregar un diccionario combinado mediante código, se obtiene una referencia al objeto ResourceDictionary primario deseado, se obtiene el valor de su propiedad MergedDictionaries y se llama a Add en la Collection genérica contenida en MergedDictionaries. El objeto que se agrega debe ser un nuevo ResourceDictionary. En el código, no se establece la propiedad Source. En cambio, se debe obtener un objeto ResourceDictionary creando o cargando uno. Una manera de cargar un ResourceDictionary existente consiste en llamar a XamlReader.Load en una secuencia de archivo XAML existente que tiene un ResourceDictionary raíz y, a continuación, convertir el valor devuelto de XamlReader.Load a ResourceDictionary.

URI de diccionarios de recursos combinados

Existen varias técnicas para incluir un diccionario de recursos combinado, que vienen dadas por el formato de identificador de recursos uniforme (URI) que se utilizará. En líneas generales, estas técnicas se pueden dividir en dos categorías: los recursos que se compilan como parte del proyecto y recursos que no se compilan como parte del proyecto.

Para los recursos que se compilan como parte del proyecto, puede utilizar una ruta de acceso relativa que hace referencia a la ubicación del recurso. La ruta de acceso relativa se evalúa durante la compilación. El recurso se debe definir como parte del proyecto como una acción de compilación de recurso. Si incluye un archivo .xaml de recursos en el proyecto como recurso, no será preciso copiar el archivo de recursos en el directorio de resultados, el recurso ya está incluido dentro de la aplicación compilada. También puede utilizar la acción de compilación de contenido, pero en este caso deberá copiar los archivos en el directorio de resultados y también implementar los archivos de recursos en la misma relación de ruta de acceso que la aplicación ejecutable.

Nota

No utilice la acción de compilación de recurso incrustado. La propia acción de compilación se admite para aplicaciones de WPF, pero la resolución de Source no incorpora ResourceManager, por lo que no puede separar el recurso individual de la secuencia. Podría utilizar la acción de recurso incrustado para otros fines, siempre que, además, utilice ResourceManager para tener acceso a los recursos.

Una técnica relacionada es utilizar un pack URI a un archivo de XAML y hacer referencia a él como el origen. El pack URI permite las referencias a los componentes de ensamblados a los que se hace referencia, y otras técnicas. Para obtener más información sobre los pack URI, consulte Archivos c Windows Presentation Foundation.

Para los recursos que no se compilan como parte del proyecto, el URI se evalúa en tiempo de ejecución. Puede utilizar un transporte de URI común, como file: o http: para hacer referencia al archivo de recursos. La desventaja de utilizar el enfoque de recursos no compilados es que el acceso con file: requiere pasos de implementación adicionales y que el acceso con http: implica la zona de seguridad de Internet.

Reutilizar diccionarios combinados

Puede reutilizar o compartir los diccionarios de recursos combinados entre las aplicaciones, porque se puede hacer referencia al diccionario de recursos que se va a combinar mediante cualquier identificador de recursos uniforme (URI) válido. Cómo se lleve esto a cabo exactamente dependerá de la estrategia de implementación de aplicaciones y del modelo de aplicación utilizado. La citada estrategia de pack URI proporciona una manera de utilizar como origen común durante la programación un recurso combinado en varios proyectos, para lo que se comparte una referencia de ensamblado. En este escenario, el cliente distribuye los recursos y, como mínimo, una de las aplicaciones debe implementar el ensamblado al que se hace referencia. También es posible hacer referencia a los recursos combinados a través de un URI distribuido que utiliza el protocolo http.

Escribir diccionarios combinados como archivos de aplicaciones locales o en el almacenamiento compartido local constituyen otros tantos escenarios posibles de implementación de diccionarios y aplicaciones.

Localización

Si los recursos que es preciso localizar están aislados en diccionarios que se combinan en los diccionarios primarios, y que se mantienen como XAML dinámico, estos archivos se pueden localizar por separado. Esta técnica constituye una alternativa ligera a la localización de los ensamblados de recursos satélite. Para obtener información detallada, consulte Información general sobre la localización y globalización de WPF.

Vea también

Conceptos

Información general sobre recursos

Recursos y código

Archivos c Windows Presentation Foundation

Referencia

ResourceDictionary