Usar y actualizar recursos dinámicos

Completado

En la unidad anterior ha definido un recurso en XAML y lo ha usado como un valor estático. Pero, hay algunos casos en los que StaticResource no es adecuado. Considere los casos siguientes:

  • Quiere implementar temas de color que permitan al usuario cambiar el aspecto de la aplicación en CLR. La extensión de marcado StaticResource realiza la búsqueda del diccionario una sola vez, por lo que no se puede actualizar la interfaz de usuario de forma dinámica.

  • Almacena las preferencias del usuario en un servidor web y las carga cuando se inicia la aplicación. La extensión de marcado StaticResource produce una excepción si la clave no se encuentra en el diccionario.

Esta unidad muestra cómo tratar problemas como estos mediante recursos dinámicos.

Cómo actualizar recursos en tiempo de ejecución

Los recursos se almacenan en un diccionario de recursos. Puede escribir código para actualizar estos recursos en CLR. Incluso puede agregar recursos nuevos o quitar existentes.

Considere el ejemplo siguiente:

<ContentPage.Resources>
    <Color x:Key="PanelBackgroundColor">Blue</Color>
</ContentPage.Resources>

Imagine que quiere cambiar el valor del recurso PanelBackgroundColor mientras se ejecuta la aplicación. Puede agregar código al archivo de código subyacente de la página para tener acceso a la propiedad Resources. En el ejemplo siguiente se actualiza el valor del recurso del ejemplo de XAML anterior a un color diferente.

this.Resources["PanelBackgroundColor"] = Colors.Green;

¿Qué es un elemento DynamicResource?

DynamicResource es otra extensión de marcado para buscar recursos en un diccionario de recursos. Se parece a StaticResource en que realiza una búsqueda de diccionario cuando se crea el objeto de destino. Pero también escucha los cambios realizados en el recurso en el diccionario. Si cambia el valor del recurso en el diccionario, DynamicResource actualiza la interfaz de usuario de forma automática.

DynamicResource tiene una ventaja sobre StaticResource. Si DynamicResource no puede encontrar la clave en el diccionario, deja la propiedad sin establecer. A diferencia de StaticResource, la ausencia de una clave no es un error y no inicia una excepción.

Nota

La naturaleza de la extensión de marcado DynamicResource impone una pequeña penalización de rendimiento en la aplicación. Aunque puede usar DynamicResource en lugar de StaticResource en sus páginas XAML, si un recurso no cambia, debería hacerle referencia con la extensión de marcado StaticResource.

Para usar el color de fondo actualizado del ejemplo anterior, puede aplicar DynamicResource en el código XAML de esta forma:

<ContentPage ...>
    <ContentPage.Resources>
        <Color x:Key="PanelBackgroundColor">Blue</Color>
    </ContentPage.Resources>

    <StackLayout BackgroundColor="{DynamicResource PanelBackgroundColor}">
    ...
    </StackLayout>
</ContentPage>

Si cambia el valor del recurso PanelBackgroundColor, el valor BackgroundColor del control StackLayout se actualizará de forma automática.

Comprobación de conocimiento

1.

¿Qué característica proporciona DynamicResource que StaticResource no?