En aplicaciones de escritorio modernas, el manejo de múltiples ventanas es un requerimiento frecuente, especialmente en herramientas empresariales o aplicaciones que gestionan múltiples contextos de usuario. WinUI 3 permite trabajar con múltiples ventanas, pero su implementación no es trivial y suele generar problemas cuando no se diseña correctamente.
A medida que la aplicación crece, una mala gestión de ventanas puede provocar fugas de memoria, pérdida de estado y experiencias inconsistentes para el usuario.
Este artículo analiza cómo implementar correctamente el manejo de múltiples ventanas en WinUI 3 en escenarios reales.
El problema Link to heading
En muchos proyectos, la apertura de nuevas ventanas se realiza de forma directa sin control centralizado.
Errores comunes:
- Creación de ventanas sin referencia
- Falta de control del ciclo de vida
- Pérdida de estado entre ventanas
- Dificultad para cerrar ventanas correctamente
- Fugas de memoria
Ejemplo incorrecto Link to heading
var window = new Window();
window.Activate();
Problemas:
- No se mantiene referencia
- No se controla el cierre
- No se puede gestionar el estado
- Difícil de escalar
En aplicaciones reales, este enfoque genera comportamientos impredecibles.
La solución Link to heading
El manejo de ventanas debe:
- Centralizarse en un servicio
- Mantener referencias activas
- Controlar el ciclo de vida
- Permitir compartir estado
Paso 1: Crear un servicio de ventanas Link to heading
public interface IWindowService
{
Window CreateWindow();
}
public class WindowService : IWindowService
{
private readonly List<Window> _windows = new();
public Window CreateWindow()
{
var window = new Window();
_windows.Add(window);
window.Closed += (s, e) =>
{
_windows.Remove(window);
};
window.Activate();
return window;
}
}
Esto permite gestionar múltiples instancias.
Paso 2: Mantener referencias Link to heading
El servicio mantiene una lista de ventanas activas.
Ventajas:
- Control del ciclo de vida
- Evitar pérdidas de referencia
- Posibilidad de interactuar con ventanas existentes
Paso 3: Compartir estado entre ventanas Link to heading
public class AppState
{
public string CurrentUser { get; set; }
}
public class SecondaryViewModel
{
private readonly AppState _state;
public SecondaryViewModel(AppState state)
{
_state = state;
}
public string User => _state.CurrentUser;
}
Esto permite sincronizar información.
Paso 4: Abrir ventanas con contexto Link to heading
public void OpenDetails()
{
var window = _windowService.CreateWindow();
var viewModel = new DetailsViewModel();
window.Content = new DetailsPage { DataContext = viewModel };
}
Esto permite inicializar correctamente cada ventana.
Paso 5: Control del cierre Link to heading
window.Closed += (s, e) =>
{
// Liberar recursos si es necesario
};
Esto evita fugas de memoria.
Paso 6: Escenarios comunes Link to heading
- Ventanas secundarias de detalle
- Herramientas flotantes
- Dashboards independientes
- Múltiples documentos abiertos
Cada caso requiere control explícito.
Paso 7: Problemas en producción Link to heading
- Ventanas duplicadas innecesarias
- Estado inconsistente
- Recursos no liberados
- UI desincronizada
Solución:
- Controlar creación
- Validar instancias
- Centralizar lógica
Buenas prácticas Link to heading
- Centralizar gestión de ventanas
- Mantener referencias activas
- Compartir estado cuando sea necesario
- Controlar eventos de cierre
- Evitar creación indiscriminada
Conclusión Link to heading
El manejo de múltiples ventanas en WinUI 3 es un aspecto avanzado que requiere diseño consciente. Una implementación adecuada permite construir aplicaciones más flexibles y alineadas con escenarios reales.
Ignorar estos principios conduce a problemas de mantenimiento, fugas de memoria y experiencias inconsistentes para el usuario.