Compartir a través de


Recursos y código

Actualización: noviembre 2007

Esta información general se concentra en cómo se puede obtener acceso a los recursos de Windows Presentation Foundation (WPF) o cómo crearlos mediante código en lugar de mediante la sintaxis Lenguaje de marcado de aplicaciones extensible (XAML). Para obtener más información sobre el uso de recursos en general y sobre los recursos desde la perspectiva de la sintaxis XAML, consulte Información general sobre recursos.

Este tema contiene las secciones siguientes.

  • Acceso a los recursos mediante código
  • Crear recursos mediante código
  • Utilizar objetos como claves
  • Temas relacionados

Acceso a los recursos mediante código

Las claves que identifican los recursos si se definen mediante XAML también se utilizan para recuperar recursos concretos cuando se solicita el recurso en el código. La manera más simple de recuperar un recurso desde el código es llamar al método FindResource o TryFindResource desde los objetos de nivel de marco de trabajo de la aplicación. La diferencia de comportamiento entre estos métodos reside en lo que ocurre si no se encuentra la clave solicitada. FindResource inicia una excepción; TryFindResource no inicia una excepción, sino que devuelve null. Cada método toma la clave de recurso como parámetro de entrada y devuelve un objeto con establecimiento flexible de tipos. Normalmente, una clave de recurso es una cadena, pero ocasionalmente se utilizan otros tipos de datos; consulte la sección Utilizar objetos como claves para obtener detalles al respecto. Lo habitual es convertir el objeto devuelto al tipo requerido por la propiedad que se está estableciendo al solicitar el recurso. La lógica de búsqueda para la resolución del recurso de código es igual que en el caso de XAML de referencia de recurso dinámico. La búsqueda de recursos comienza desde el elemento que realiza la llamada, y continúa a los elementos primarios sucesivos del árbol lógico. La búsqueda continúa avanzando por los recursos de la aplicación, los temas y los recursos del sistema si es necesario. Una solicitud mediante código de un recurso tendrá en cuenta correctamente los cambios en tiempo de ejecución que puedan hacerse en los diccionarios de recursos después de cargarlos desde XAML, así como los cambios que se hagan en los recursos del sistema en tiempo real.

A continuación, se muestra un breve ejemplo de código que busca un recurso por su clave y utiliza el valor devuelto para establecer una propiedad, que se implementa como controlador del evento Click.

void SetBGByResource(object sender, RoutedEventArgs e)
{
  Button b = sender as Button;
  b.Background = (Brush)this.FindResource("RainbowBrush");
}

Un método alternativo para asignar una referencia de recurso es SetResourceReference. Este método toma dos parámetros: la clave del recurso y el identificador correspondiente a una propiedad de dependencia determinada que está presente en la instancia de elemento a la que debería estar asignado el valor de recurso. Funcionalmente, este método es igual, y tiene la ventaja de no requerir ninguna conversión de los valores devueltos.

Otra manera más de tener acceso a los recursos mediante programación es obtener acceso al contenido de la propiedad Resources como diccionario. Tener acceso al diccionario contenido por esta propiedad también constituye la manera de agregar nuevos recursos a las colecciones existentes, comprobar si la colección ya ha aceptado un nombre de clave determinado y realizar otras operaciones de diccionario o colección. Si está escribiendo una aplicación de WPF mediante código en su totalidad, también puede crear la colección completa en código, asignarle claves y, a continuación, asignar la colección acabada a la propiedad Resources de un elemento establecido. Esto se describe en la sección siguiente.

Puede indizar dentro de cualquier colección Resources determinada utilizando una clave concreta como índice, pero debe tener en cuenta que al tener acceso al recurso de esta manera no se siguen las reglas de tiempo de ejecución normales para la resolución de recursos. Únicamente se tiene acceso a esa colección en particular. La búsqueda de recursos no recorrerá el ámbito hasta la raíz ni la aplicación si no se encuentra ningún objeto válido en la clave solicitada. Sin embargo, este enfoque puede presentar ventajas de rendimiento en algunos casos precisamente por esta restricción del ámbito de búsqueda de la clave. Consulte la clase ResourceDictionary para obtener más detalles sobre cómo trabajar directamente con el diccionario de recursos.

Crear recursos mediante código

Si está creando una aplicación de WPF completa mediante código, es posible que también desee crear los recursos de esa aplicación mediante código. Para ello, cree una nueva instancia de ResourceDictionary y, a continuación, agregue todos los recursos al diccionario mediante llamadas sucesivas a ResourceDictionary.Add. Después, utilice el ResourceDictionary así creado para establecer la propiedad Resources en un elemento que esté presente en el ámbito de una página, o la propiedad Application.Resources. También puede mantener ResourceDictionary como objeto independiente sin agregarlo a un elemento. Sin embargo, si lo hace, deberá tener acceso a los recursos contenidos en él por su clave de elemento, como si se tratase de un diccionario genérico. Si un ResourceDictionary no está asociado a la propiedad Resources de un elemento o existirá como parte del árbol del elemento y no tendrá ningún ámbito en la secuencia de búsqueda utilizada por FindResource y otros métodos relacionados.

Utilizar objetos como claves

La mayoría de los usos de recursos establecen la clave de recurso en una cadena. Sin embargo, en varias características de WPF deliberadamente no se utiliza un tipo de cadena para especificar las claves, sino un objeto. La capacidad de que la clave de un recurso sea un objeto se utiliza en la compatibilidad de estilos y temas de WPF. Las claves de los estilos de los temas que se convierten en el estilo predeterminado de un control que, salvo éste, no tiene ningún otro estilo, se determinan mediante el objeto Type del control al que se deben aplicar. El hecho de que la clave sea un tipo proporciona un mecanismo de búsqueda confiable que funciona en las instancias predeterminadas de cada tipo de control. Además, el tipo se puede detectar por reflexión y utilizar para las clases de estilos derivadas aunque, por lo demás, el tipo derivado no tenga ningún estilo predeterminado. Puede especificar una clave Type para un recurso definido en XAML utilizando Extensión de marcado x:Type. Existen extensiones similares para otros usos de clave que no son de cadena y que admiten las características de WPF, como Extensión de marcado ComponentResourceKey.

Vea también

Conceptos

Información general sobre recursos

Aplicar estilos y plantillas