Diccionarios de recursos combinados

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 (Directiva), 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 (Directiva). Normalmente, cada objeto ResourceDictionary de la colección MergedDictionaries especifica un atributo Source. El valor de Source debe ser un uniform resource identifier (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.

NotaNota

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 objeto ResourceDictionary existente consiste en llamar a XamlReader.Load en una secuencia de archivos XAML existente que tiene un objeto ResourceDictionary raíz y, a continuación, convertir el valor devuelto de XamlReader.Load a ResourceDictionary.

URI de diccionarios de recursos combinados

Hay varias técnicas para incluir un diccionario de recursos combinado, que se indican mediante el formato de uniform resource identifier (URI) que utilizará. Por lo general, estas técnicas se pueden dividir en dos categorías: 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.

NotaNota

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 habilita las referencias a los componentes de los ensamblados a los que se hace referencia y otras técnicas. Para obtener más información sobre los pack URI, vea Archivos de recursos, contenido y datos de aplicaciones de WPF.

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 uniform resource identifier (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 sigue distribuyendo los recursos y al menos una de las aplicaciones debe implementar el ensamblado al que se hace referencia. También es posible hacer referencia a los recursos combinados con un URI distribuido que utilice 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, vea Información general sobre la localización y globalización de WPF.

Vea también

Referencia

ResourceDictionary

Conceptos

Información general sobre recursos

Recursos y código

Archivos de recursos, contenido y datos de aplicaciones de WPF