Recursos y código

Esta información general se centra en cómo se puede acceder a los recursos de Windows Presentation Foundation (WPF) o cómo se pueden crear mediante código en lugar de la sintaxis del Lenguaje de marcado de aplicaciones extensible (XAML). Para más información sobre el uso de recursos generales y recursos desde una perspectiva de la sintaxis de XMAL, vea Recursos XAML.

Obtener acceso a recursos desde código

Las claves que identifican los recursos si se definen mediante XAML también se usan para recuperar recursos específicos si solicita el recurso en el código. La manera más sencilla de recuperar un recurso del código consiste en llamar al método FindResource o TryFindResource desde objetos de nivel de marco en la aplicación. La diferencia de comportamiento entre estos métodos es lo que ocurre si no se encuentra la clave solicitada. FindResource genera una excepción; TryFindResource no generará una excepción, pero devuelve null. Cada método obtiene la clave de recurso como parámetro de entrada y devuelve un objeto escrito de manera imprecisa. Normalmente, una clave de recurso es una cadena, pero hay usos ocasionales en los que no. Consulte la sección Usar objetos como claves para obtener más información. Normalmente, convertiría el objeto devuelto al tipo que necesita la propiedad que está estableciendo al solicitar el recurso. La lógica de búsqueda para la resolución de recursos de código es la misma que la del caso de referencia de recursos dinámicos de XAML. La búsqueda de recursos comienza desde el elemento que realiza la llamada y continúa hasta los elementos principales sucesivos del árbol lógico. La búsqueda continúa hasta los recursos de la aplicación, los temas y los recursos del sistema, si es necesario. Una solicitud de código para un recurso tendrá en cuenta correctamente los cambios en tiempo de ejecución en los diccionarios de recursos que puedan haberse realizado después de que se cargara ese diccionario de recurso desde XAML y también para cambios de recursos del sistema en tiempo real.

En el breve ejemplo de código siguiente se busca un recurso por clave y se usa el valor devuelto para establecer una propiedad, implementada como controlador de eventos Click.

void SetBGByResource(object sender, RoutedEventArgs e)
{
  Button b = sender as Button;
  b.Background = (Brush)this.FindResource("RainbowBrush");
}
Private Sub SetBGByResource(ByVal sender As Object, ByVal e As RoutedEventArgs)
  Dim b As Button = TryCast(sender, Button)
  b.Background = CType(Me.FindResource("RainbowBrush"), Brush)
End Sub

Un método alternativo para asignar una referencia de recursos es SetResourceReference. Este método usa dos parámetros: la clave del recurso y el identificador de una propiedad de dependencia determinada que existe en la instancia del elemento al que se debe asignar el valor del recurso. Funcionalmente, este método es el mismo y tiene la ventaja de que no necesita ninguna conversión de valores devueltos.

Otra manera de acceder a los recursos mediante programación consiste en acceder al contenido de la propiedad Resources como un diccionario. Obtener acceso al diccionario que contiene esta propiedad también es el modo de agregar nuevos recursos a las colecciones existentes, comprobar si el nombre de una clave ya existe en la colección y otras operaciones de diccionario o colección. Si va a escribir una aplicación para WPF completamente en código, también puede crear la colección completa en el código, asignarle claves y, después, asignar la colección acabada a la propiedad Resources de un elemento establecido. Esto se describe en la sección siguiente.

Puede indexar dentro de cualquier colección Resources con una clave específica como índice, pero debe tener en cuenta que el acceso al recurso de esta manera no sigue las reglas de tiempo de ejecución normales de la resolución de recursos. Solo obtiene acceso a esa colección concreta. La búsqueda de recursos no recorrerá el ámbito hasta la raíz o aplicación si no se encuentra ningún objeto válido en la clave solicitada. Sin embargo, este enfoque puede tener ventajas de rendimiento en algunos casos, precisamente porque el ámbito de la búsqueda de la clave está más restringido. Vea la clase ResourceDictionary para más información sobre cómo trabajar directamente con el diccionario de recursos.

Crear recursos mediante código

Si quiere crear toda una aplicación WPF con código, también es posible que quiera crear los recursos de la aplicación con código. Para ello, cree una instancia de ResourceDictionary y, después, agregue todos los recursos al diccionario mediante llamadas sucesivas a ResourceDictionary.Add. Luego, use el ResourceDictionary creado para establecer la propiedad Resources en un elemento que esté presente en un ámbito de página o en Application.Resources. También puede mantener ResourceDictionary como un objeto independiente sin agregarlo a ningún elemento. Sin embargo, si lo hace, deberá obtener acceso a los recursos que contenga mediante clave de producto, como si fuera un diccionario genérico. Un ResourceDictionary que no está adjunto a una propiedad Resources de elemento no existiría como parte del árbol de elementos y no tiene ningún ámbito en una secuencia de búsqueda que puedan usar FindResource y métodos relacionados.

Usar objetos como claves

La mayoría de los usos de recursos establecen la clave de recurso en una cadena. Pero varias características de WPF no usan deliberadamente un tipo de cadena para especificar las claves; en su lugar, este parámetro es un objeto. La compatibilidad de temas y estilos de WPF aprovecha la funcionalidad de que un objeto asigne la clave a un recurso. El objeto Type del control al que se deben aplicar los estilos de los temas que se convierten en el estilo predeterminado para un control sin estilo los asigna con clave. Asignar claves por tipo proporciona un mecanismo de búsqueda confiable que funciona en instancias predeterminadas de cada tipo de control. La reflexión puede detectar el tipo y usarlo para clases derivadas de estilo aunque el tipo derivado no tenga ningún estilo predeterminado. Puede especificar una clave Type para un recurso definido en XAML con la extensión de marcado x:Type. Existen extensiones similares para otros usos de clave que no son cadenas que admiten características de WPF, como la extensión de marcado ComponentResourceKey.

Consulte también