En aplicaciones de escritorio modernas, la navegación deja de ser un detalle de implementación y pasa a ser un componente estructural que define la experiencia del usuario y la organización interna del sistema. En WinUI 3, existen múltiples formas de implementar navegación, pero no todas son adecuadas para aplicaciones reales.
A medida que la aplicación crece, una navegación mal diseñada genera acoplamiento, duplicación de lógica y dificultades para mantener el flujo de la aplicación.
Este artículo analiza los patrones de navegación en WinUI 3 desde una perspectiva profesional, enfocándose en escalabilidad y mantenibilidad.
El problema Link to heading
En muchos proyectos, la navegación se implementa de forma directa utilizando instancias de páginas sin una estrategia clara.
Errores comunes:
- Navegación directa desde code-behind
- Creación manual de páginas sin control
- Falta de estado en navegación
- Dependencias entre vistas
- Dificultad para testear flujos
Ejemplo incorrecto Link to heading
private void Navigate_Click(object sender, RoutedEventArgs e)
{
Frame.Navigate(typeof(DetailsPage));
}
Problemas:
- Lógica de navegación en la vista
- No existe abstracción
- Difícil de mantener
- No reutilizable
En aplicaciones reales, este enfoque no escala.
La solución Link to heading
La navegación debe abstraerse como un servicio, desacoplado de la UI.
Principios:
- Centralizar navegación
- Evitar dependencias directas entre vistas
- Permitir control del estado
- Facilitar testing
Paso 1: Crear un servicio de navegación Link to heading
public interface INavigationService
{
void Navigate(Type pageType, object parameter = null);
}
public class NavigationService : INavigationService
{
private readonly Frame _frame;
public NavigationService(Frame frame)
{
_frame = frame;
}
public void Navigate(Type pageType, object parameter = null)
{
_frame.Navigate(pageType, parameter);
}
}
Esto encapsula la navegación.
Paso 2: Usar navegación desde ViewModel Link to heading
public class MainViewModel
{
private readonly INavigationService _navigation;
public MainViewModel(INavigationService navigation)
{
_navigation = navigation;
}
public void GoToDetails()
{
_navigation.Navigate(typeof(DetailsPage));
}
}
El ViewModel controla el flujo.
Paso 3: Integración con comandos Link to heading
public ICommand NavigateCommand { get; }
public MainViewModel(INavigationService navigation)
{
_navigation = navigation;
NavigateCommand = new RelayCommand(GoToDetails);
}
Vista:
<Button Content="Ir a detalles"
Command="{x:Bind ViewModel.NavigateCommand}" />
Paso 4: Manejo de parámetros Link to heading
_navigation.Navigate(typeof(DetailsPage), selectedItem);
En la página:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
var item = e.Parameter;
}
Esto permite pasar contexto.
Paso 5: Control del historial Link to heading
El Frame mantiene historial automáticamente.
if (_frame.CanGoBack)
{
_frame.GoBack();
}
Se puede encapsular en el servicio.
Paso 6: Escalabilidad Link to heading
En aplicaciones grandes, se recomienda:
- Definir rutas lógicas
- Evitar referencias directas a tipos
- Usar identificadores de navegación
Ejemplo:
public enum PageKey
{
Main,
Details
}
Esto desacopla aún más la navegación.
Buenas prácticas Link to heading
- Centralizar navegación en un servicio
- Evitar navegación directa desde la vista
- Usar comandos para ejecutar acciones
- Manejar parámetros explícitamente
- Preparar el sistema para crecimiento
Conclusión Link to heading
La navegación en WinUI 3 es un componente arquitectónico que debe diseñarse cuidadosamente. Un enfoque estructurado permite construir aplicaciones escalables, mantenibles y con flujos claros.
Ignorar estos principios conduce a sistemas difíciles de evolucionar y con alto acoplamiento entre componentes.