Compartir a través de


Recursos en el código

Esta introducción se centra en cómo se puede acceder a los recursos de Windows Presentation Foundation (WPF) o crearlos 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 sintaxis XAML, consulta Introducción a los recursos XAML.

Acceso a recursos desde código

Las claves que identifican los recursos definidos por 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 a nivel de framework en su aplicación. La diferencia de comportamiento entre estos métodos es lo que sucede si no se encuentra la clave solicitada. FindResource genera una excepción. TryFindResource no generará una excepción, pero devuelve null. Cada método toma la clave de recurso como parámetro de entrada y devuelve un objeto de tipo flexible.

Normalmente, una clave de recurso es una cadena, pero hay usos ocasionales de no cadena. La lógica de búsqueda para la resolución de recursos de código es igual al caso de referencia de recursos dinámicos en XAML. La búsqueda de recursos comienza desde el elemento que realiza la llamada y, a continuación, continúa a través de los elementos primarios del árbol lógico. La búsqueda continúa en adelante en recursos de aplicación, temas y 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 produjeron durante el tiempo de ejecución.

En el ejemplo de código siguiente se muestra un Click controlador de eventos que encuentra 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 toma dos parámetros: la clave del recurso y el identificador de una propiedad de dependencia determinada que está presente en la instancia de elemento a la que se debe asignar el valor del recurso. Funcionalmente, este método es el mismo y tiene la ventaja de no requerir ninguna conversión de valores devueltos.

Otra manera de acceder a los recursos mediante programación es tener acceso al contenido de la Resources propiedad como diccionario. Los diccionarios de recursos se usan para agregar nuevos recursos a las colecciones existentes, compruebe si la colección ya usa un nombre de clave determinado y otras operaciones. Si estás escribiendo una aplicación WPF totalmente en código, también puedes crear toda la colección mediante código y asignar recursos a esta. A continuación, la colección se puede asignar a la Resources propiedad de un elemento . Esto se describe en la sección siguiente.

Puede indexar dentro de cualquier colección determinada Resources , usando 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 tiene acceso a esa colección concreta. La búsqueda de recursos no recorre el ámbito del recurso hasta la raíz o el nivel de la aplicación cuando no se encuentra un 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 ResourceDictionary clase .

Creación de recursos con código

Si desea crear una aplicación de WPF completa en el código, es posible que también quiera crear recursos en esa aplicación en el código. Para ello, cree una nueva ResourceDictionary instancia y agregue todos los recursos al diccionario mediante llamadas sucesivas a ResourceDictionary.Add. A continuación, asigne el objeto creado ResourceDictionary para establecer la Resources propiedad en un elemento que está presente en un ámbito de página o .Application.Resources También puede mantener ResourceDictionary como un objeto independiente sin agregarlo a un elemento. Sin embargo, si lo hace, debe acceder a los recursos dentro de él por clave de elemento, como si fuera un diccionario genérico. Un ResourceDictionary que no está asociado a una propiedad de elemento Resources no existiría como parte del árbol de elementos y no tiene ningún ámbito en una secuencia de búsqueda que se pueda usar por FindResource y métodos relacionados.

Uso de objetos como claves

La mayoría de los usos de recursos establecerán la clave del recurso como una cadena. Sin embargo, varias características de WPF usan deliberadamente el tipo de objeto como clave en lugar de una cadena. La capacidad de asociar el recurso a un tipo de objeto se utiliza por el estilo y soporte de temáticas de WPF. Los estilos y los temas que se convierten en el valor predeterminado de un control que de otro modo no tiene estilo están basados en la clave del 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. La reflexión puede detectar el tipo y usarse para aplicar estilos a clases derivadas aunque el tipo derivado no tenga ningún estilo predeterminado. Puedes especificar una Type clave para un recurso definido en XAML mediante la extensión de marcado x:Type. Existen extensiones similares para otros usos de clave que no son de cadena que admiten características de WPF, como La extensión de marcado ComponentResourceKey.

Para obtener más información, vea Estilos, DataTemplates y claves implícitas.

Consulte también