> For the complete documentation index, see [llms.txt](https://elguerre.gitbook.io/de0an/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://elguerre.gitbook.io/de0an/capitulo-9-la-construccion.-navegacion-y-configuracion-de-usuario/refinando.md).

# Refinando

A lo largo de este capítulo hemos abordado numerosos temas relacionados con la navegación, la configuración y la experiencia de usuario. Revisemos a continuación algunos consejos prácticos que nos ayudarán a mejorar la calidad y el mantenimiento de nuestra aplicación.

## Propiedades de automatización en los controles

Es importante añadir a nuestros controles las propiedades de automatización (*AutomationProperties*), tales como *AutomationProperties.Name* y *AutomationProperties.AutomationId*. Estas propiedades permiten que las herramientas de accesibilidad y las pruebas de interfaz de usuario automatizadas puedan identificar y acceder a cada control correctamente. Además, contribuyen a que nuestra aplicación sea más inclusiva para usuarios con necesidades especiales.

```
<Button AutomationProperties.Name="SaveButton"
        AutomationProperties.AutomationId="btnSave"
        Command="{Binding AppBarSaveCommand}"
        Style="{StaticResource AppBarButtonSave}"/>
```

Revisaremos todas las páginas para asegurar que los controles interactivos cuenten con estas propiedades, lo que también nos facilitará la creación de pruebas automatizadas de interfaz de usuario como vimos en el capítulo 6.

## Reorganización de App.xaml.cs en AppManager

A medida que nuestra aplicación crece, la clase *App.xaml.cs* tiende a acumular cada vez más código de inicialización, gestión de eventos y configuración. Para mantener una estructura limpia y fácil de mantener, extraeremos esta lógica a una nueva clase "AppManager.cs" que se encargue de centralizar la gestión del ciclo de vida de la aplicación.

De esta forma, *App.xaml.cs* permanecerá lo más reducida posible, delegando en *AppManager* las responsabilidades de inicialización, configuración y gestión de eventos como *OnActivated* u *OnSuspending*. Aplicamos así el principio de responsabilidad única que nos facilitará el mantenimiento a largo plazo.

## Consolidación de estilos de botones

Aprovecharemos también para realizar un refinado completo de todos los botones utilizados en la aplicación, unificando sus estilos en el fichero *ButtonStyles.xaml*. Revisaremos que cada botón cuente con su estilo correspondiente y eliminaremos aquellos estilos que hayan quedado en desuso. Mantener un único fichero de referencia para todos los estilos de botones facilita su localización y modificación, evitando además duplicidades que podrían generar comportamientos inesperados.

## Uso eficiente de VisualStateManager

Tras haber trabajado con *VisualStateManager* para adaptar la interfaz a distintos tamaños de pantalla, conviene recordar algunas buenas prácticas:

* Definir siempre un estado "Default" o "Normal" que represente la apariencia base del control.
* Utilizar *AdaptiveTrigger* para los cambios basados en el ancho de la ventana, en lugar de gestionar manualmente el evento *SizeChanged*.
* Agrupar los estados relacionados en un mismo *VisualStateGroup* para evitar transiciones inesperadas entre estados que no deberían coexistir.

## Optimización del rendimiento en la navegación

Durante este capítulo hemos conocido técnicas para mejorar el rendimiento de nuestra aplicación. Recordemos las más relevantes:

* Utilizar *NavigationCacheMode* con valor "Required" en aquellas páginas cuyos datos no cambian con frecuencia, evitando así recargas innecesarias.
* Aplicar la carga incremental (*Incremental Loading*) en listados extensos para que el usuario perciba una respuesta inmediata.
* Emplear *NotifyTaskCompletion* para cargar datos en segundo plano mostrando un indicador de progreso al usuario.
* Minimizar el uso de *Messenger* para evitar dependencias ocultas entre ViewModels. Utilizarlo únicamente cuando no exista una relación directa entre los componentes que necesitan comunicarse.

## Depurando aplicaciones implementadas

Al margen de la depuración estándar de una aplicación, contamos con otros mecanismos para poder depurar una aplicación, concretamente para aplicaciones UWP previamente instaladas. Para habilitar dicha depuración seguiremos los siguientes pasos:

1. Acceder a la opción de menú: "Debug – Other Debug Targets – Debug Installed App Package…"
2. Seleccionar la aplicación/paquete y pulsar "Start".

![](https://240651724-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfrvHBNivOTy0fVKROgzo%2Fuploads%2Fgit-blob-4ac1b7a362dc73e987d7e70909b76526d0f64588%2Fimage3.png?alt=media)

**Figura 02.- Depurando aplicaciones UWP instaladas previamente**
