Manejo de errores extraños en aplicaciones WinUI 3
La aplicación WinUI 3 funciona correctamente en modo depuración, pero se cierra inesperadamente al compilarse en versión publicación. A continuación se muestra el error correspondiente.

Rara vez me encuentro con este tipo de fallos extraños en el desarrollo habitual. WinUI 3 suele lanzar excepciones internas de tiempo de ejecución, lo que dificulta extraer pistas útiles de la pila de errores.
Tras varias rondas de pruebas de eliminación, determiné que el cierre inesperado se debe a una referencia nula que aparece al inicializar el ViewModel dentro de una página. Esta es la estructura del proyecto: una ventana principal con un menú de navegación lateral. Al pulsar los elementos del menú, se cargan las páginas destino en el área de contenido principal de la derecha. Este es el fragmento XAML que usa la ventana principal.
<TabView Name="tabView" IsAddTabButtonVisible="False" Margin="10" VerticalAlignment="Stretch" TabCloseRequested="TabView_TabCloseRequested">
<TabViewItem x:Uid="tabConsonant" Name="tvHome">
</TabViewItem>
</TabView>Lenguaje del código: HTML, XML (xml)
Este control TabView aloja las páginas de contenido en la zona derecha. Asigno la instancia de la página destino a tvHome desde el código subyacente.
private void MainWindow_Activated(object sender, WindowActivatedEventArgs args)
{
tvHome.Content = new ConsonantsPage();
}Lenguaje del código: JavaScript (javascript)
Más depuración confirmó que el fallo ocurre exactamente en la línea this.DataContext = vm; dentro de la página destino.

Luego probé una página vacía sin DataContext ni enlaces de datos, que se carga sin ningún problema. Por lo tanto, la causa raíz está relacionada definitivamente con la lógica de enlaces XAML. En lugar de seguir usando el enlace MVVM estándar, recurrí a una solución alternativa: crear los elementos de interfaz mediante código directamente en el archivo de código subyacente.
Solución final funcional:
Crear todos los controles y establecer los enlaces de valores completamente desde el código C# del backend:
public TonePage()
{
InitializeComponent();
Loaded += Page_Loaded;
}
private void Page_Loaded(object sender, RoutedEventArgs e)
{
var toneData = ThaiAlphabetSource.Tones;
FillToneGrid(gvToneList, toneData);
}
private void FillToneGrid(GridView grid, List<ToneInfo> source)
{
foreach (var item in source)
{
Button btnRoot = new Button
{
HorizontalContentAlignment = HorizontalAlignment.Center,
VerticalContentAlignment = VerticalAlignment.Center,
Tag = item.Audio
};
btnRoot.Click += PlayClick;
StackPanel sp = new StackPanel
{
Width = 240,
Orientation = Orientation.Vertical,
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center
};
TextBlock tbTitle = new TextBlock
{
HorizontalAlignment = HorizontalAlignment.Center,
FontSize = 50,
Foreground = new SolidColorBrush(Color.FromArgb(0xFF, 0x01, 0xA0, 0xC7)),
Text = item.Letter_Title
};
TextBlock tbName = new TextBlock
{
HorizontalAlignment = HorizontalAlignment.Center,
FontSize = 30,
Text = item.Letter_Name
};
TextBlock tbScript = new TextBlock
{
HorizontalAlignment = HorizontalAlignment.Center,
FontSize = 30,
Text = item.Letter_Script
};
sp.Children.Add(tbTitle);
sp.Children.Add(tbName);
sp.Children.Add(tbScript);
btnRoot.Content = sp;
grid.Items.Add(btnRoot);
}
}Lenguaje del código: PHP (php)
No profundicé para localizar el error interno exacto, pero sospecho que el problema surge por la sintaxis de enlace de comandos como Command="{Binding PlayCommand}". Otra prueba respalda esta suposición: las páginas que solo usan enlaces de propiedades sin ningún enlace de comandos funcionan sin problemas, tal como se muestra a continuación.
<Button Content="{Binding}" Grid.Row="0" Grid.Column="1" BorderBrush="#ccc" Foreground="Black" FontSize="50" Height="100" Width="130" Click="Button_Click"/>Lenguaje del código: HTML, XML (xml)
Esta variante funciona con normalidad en la configuración de publicación.