Recursos en el código (WPF .NET)

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

Obtener acceso a recursos desde código

Las claves que identifican los recursos definidos en 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 es 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 inicia una excepción. TryFindResource no iniciará 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 es una cadena. 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 por los elementos principales 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 esos recursos que se han producido durante el tiempo de ejecución.

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

private void myButton_Click(object sender, RoutedEventArgs e)
{
    Button button = (Button)sender;
    button.Background = (Brush)this.FindResource("RainbowBrush");
}
Private Sub myButton_Click(sender As Object, e As RoutedEventArgs)
    Dim buttonControl = DirectCast(sender, Button)
    buttonControl.Background = DirectCast(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.

Todavía hay otra manera de obtener acceso a los recursos mediante programación. Se trata de obtener acceso al contenido de la propiedad Resources como diccionario. Los diccionarios de recursos se usan para agregar nuevos recursos a las colecciones existentes, comprobar si la colección ya usa un nombre de clave determinado y otras operaciones. Si va a escribir una aplicación WPF completamente en el código, también puede crear toda la colección en el código y asignarle recursos. La colección se puede asignar a la propiedad Resources de un elemento. Este tema se describe en la siguiente sección.

Puede indexar dentro de cualquier colección Resources determinada utilizando una clave específica como índice. Los recursos a los que se accede de esta manera no siguen las reglas normales de tiempo de ejecución de la resolución de recursos. Solo obtiene acceso a esa colección concreta. La búsqueda de recursos no recorrerá el ámbito de recursos 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. Para obtener más información sobre cómo trabajar directamente con un diccionario de recursos, consulte la clase ResourceDictionary.

Creación de 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 nueva instancia ResourceDictionary y agregue todos los recursos al diccionario mediante llamadas sucesivas a ResourceDictionary.Add. A continuación, asigne 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 el 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 los FindResource y métodos relacionados.

Uso de objetos como claves

La mayoría de los usos de recursos establecen la clave de recurso en una cadena. Sin embargo, varias características de WPF usan deliberadamente el tipo de objeto como clave en lugar de una cadena. La compatibilidad de temas y estilos de WPF aprovecha la funcionalidad de que un objeto asigne la clave a un recurso. Los estilos y los temas que devienen el valor predeterminado de un control que en otro caso no tendría estilo, tienen cada uno una clave asignada mediante el Type del control al que se deben aplicar.

La clave por tipo proporciona un mecanismo de búsqueda confiable que funciona en instancias predeterminadas de cada tipo de control. El tipo puede ser detectado por reflexión y utilizado para aplicar estilos a las clases derivadas aunque el tipo derivado no tenga ningún estilo por defecto. 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.

Para obtener más información, consulte Estilos, plantillas de datos y claves implícitas.

Vea también