Die WinUI 3-Anwendung läuft im Debugmodus fehlerfrei, stürzt aber bei einem Release-Build ab. Der dazugehörige Fehler ist unten abgebildet.

Bei regulären Entwicklungsarbeiten begegne ich solchen seltsamen Fehlern nur selten. WinUI 3 wirft meist interne Laufzeitausnahmen aus, wodurch es schwierig ist, aussagekräftige Hinweise aus dem Ausnahmestapel herauszulesen.
Nach mehreren Testläufen zur Eingrenzung des Fehlers habe ich herausgefunden, dass der Absturz durch eine Nullreferenz während der Initialisierung des ViewModels innerhalb einer Seite verursacht wird. Die Projektstruktur sieht wie folgt aus: Es gibt ein Hauptfenster mit einer seitlichen Navigationsleiste. Ein Klick auf die Menüeinträge lädt die zugehörigen Seiten in den rechten Hauptinhaltsbereich. Im Hauptfenster wird dieser XAML-Codeausschnitt verwendet:
<TabView Name="tabView" IsAddTabButtonVisible="False" Margin="10" VerticalAlignment="Stretch" TabCloseRequested="TabView_TabCloseRequested">
<TabViewItem x:Uid="tabConsonant" Name="tvHome">
</TabViewItem>
</TabView>Code-Sprache: HTML, XML (xml)
Dieses TabView-Steuerelement zeigt die Inhaltsseiten auf der rechten Seite an. Im Hintergrundcode weise ich die Instanz der Zielseite dem Element tvHome zu:
private void MainWindow_Activated(object sender, WindowActivatedEventArgs args)
{
tvHome.Content = new ConsonantsPage();
}Code-Sprache: JavaScript (javascript)
Weitere Debugging-Maßnahmen bestätigten, dass der Absturz exakt in der Zeile this.DataContext = vm; der Zielseite auftritt.

Anschließend habe ich eine leere Testseite ohne DataContext und Datenbindung ausprobiert, die sich problemlos laden ließ. Der Hauptgrund liegt also eindeutig in der Bindungslogik von XAML. Statt weiterhin die standardmäßige MVVM-Bindung zu nutzen, habe ich als Übergangslösung die Benutzeroberflächenelemente direkt im Code-Behind programmatisch erstellt.
Funktionierende Endlösung:
Erstellung aller Steuerelemente und Wertbindungen vollständig über den C#-Hintergrundcode:
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
{
HorizontalContentAlignment = HorizontalAlignment.Center,
FontSize = 50,
Foreground = new SolidColorBrush(Color.FromArgb(0xFF, 0x01, 0xA0, 0xC7)),
Text = item.Letter_Title
};
TextBlock tbName = new TextBlock
{
HorizontalContentAlignment = HorizontalAlignment.Center,
FontSize = 30,
Text = item.Letter_Name
};
TextBlock tbScript = new TextBlock
{
HorizontalContentAlignment = 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);
}
}Code-Sprache: PHP (php)
Ich habe nicht weiter nach der genauen Ursache des zugrundeliegenden Fehlers gesucht, gehe aber davon aus, dass das Problem durch Befehlsbindungen wie Command="{Binding PlayCommand}" verursacht wird. Diese Vermutung wird durch einen weiteren Test gestützt: Seiten, die nur Eigenschaftsbindungen ohne Befehlsbindungen verwenden, laufen einwandfrei, wie im folgenden Beispiel zu sehen ist:
<Button Content="{Binding}" Grid.Row="0" Grid.Column="1" BorderBrush="#ccc" Foreground="Black" FontSize="50" Height="100" Width="130" Click="Button_Click"/>Code-Sprache: HTML, XML (xml)
Diese Variante funktioniert in der Release-Konfiguration fehlerfrei.