WinUI 3 uygulaması Hata Ayıklama modunda sorunsuz çalışır, ancak Sürüm derlemesi alındığında çöker. Karşımıza çıkan hata detayları aşağıda verilmiştir.

Genel geliştirme süreçlerinde bu tür tuhaf hatalarla nadiren karşılaşırım. WinUI 3 çoğunlukla iç çalışma zamanı istisnaları fırlatır, bu da istisna yığınından faydalı ipuçları bulmayı oldukça zorlaştırır.
Birden fazla eleme testi sonucunda, sayfa içindeki ViewModel başlatılırken oluşan boş referans hatasının uygulamayı çökerdiğini tespit ettim. Proje yapım şu şekildedir: Yan çubuk gezinme menüsüne sahip bir ana pencere bulunur. Menü öğelerine tıklandığında hedef sayfalar sağdaki ana içerik alanına yüklenir. Ana pencerede kullanılan XAML kod parçası aşağıdadır:
<TabView Name="tabView" IsAddTabButtonVisible="False" Margin="10" VerticalAlignment="Stretch" TabCloseRequested="TabView_TabCloseRequested">
<TabViewItem x:Uid="tabConsonant" Name="tvHome">
</TabViewItem>
</TabView>Code language: HTML, XML (xml)
Bu TabView denetimi, sağ kısımdaki içerik sayfalarını barındırır. Arka plandaki kod üzerinden hedef sayfa örneğini tvHome nesnesine atıyorum:
private void MainWindow_Activated(object sender, WindowActivatedEventArgs args)
{
tvHome.Content = new ConsonantsPage();
}Code language: JavaScript (javascript)
Ek hata ayıklama çalışmaları, çökmelerin tam olarak hedef sayfa içerisindeki this.DataContext = vm; satırında gerçekleştiğini doğruladı.

Ardından DataContext ve veri bağlama işlemlerinin hiç kullanılmadığı boş bir sayfa denedim ve bu sayfa hatasız bir şekilde yüklendi. Dolayısıyla temel sorunun kaynağı kesinlikle XAML bağlama mantığıdır. Standart MVVM bağlama yapısını kullanmaya devam etmek yerine geçici bir çözüm olarak kullanıcı arayüzü öğelerini doğrudan arka plan kodunda programatik olarak oluşturmaya geçtim.
Son çalışan çözüm:
Tüm denetimlerin oluşturulması ve değer bağlamaları tamamen C# arka plan kodu ile gerçekleştirilir:
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 language: PHP (php)
Temel hatanın tam kaynağını bulmak için daha derin bir araştırma yapmadım fakat sorunun Command="{Binding PlayCommand}" gibi komut bağlama sözdiziminden kaynaklandığını düşünüyorum. Bu tahminimi başka bir test senaryosu da destekliyor: Komut bağlaması olmadan yalnızca özellik bağlaması kullanan sayfalar aşağıdaki örnekte görüldüğü gibi sorunsuz çalışır.
<Button Content="{Binding}" Grid.Row="0" Grid.Column="1" BorderBrush="#ccc" Foreground="Black" FontSize="50" Height="100" Width="130" Click="Button_Click"/>Code language: HTML, XML (xml)
Bu yapı, Sürüm yapılandırmasında normal şekilde çalışmaktadır.