Gestion des anomalies étranges dans les applications WinUI 3
L’application WinUI 3 fonctionne parfaitement en mode débogage, mais elle plante lors de la compilation en version publication. L’erreur obtenue est présentée ci-dessous.

Je rencontre rarement ce type de problème inhabituel dans le développement classique. WinUI 3 renvoie la plupart du temps des exceptions d’exécution internes, ce qui complique la recherche d’indices pertinents dans la pile d’exceptions.
Après plusieurs séries de tests de diagnostic, j’ai identifié que le plantage est causé par une référence nulle survenue lors de l’initialisation du ViewModel dans une page. Voici la structure du projet : une fenêtre principale avec un menu de navigation latéral. Un clic sur un élément du menu charge la page cible dans la zone de contenu principale à droite. Voici l’extrait XAML utilisé dans la fenêtre principale.
<TabView Name="tabView" IsAddTabButtonVisible="False" Margin="10" VerticalAlignment="Stretch" TabCloseRequested="TabView_TabCloseRequested">
<TabViewItem x:Uid="tabConsonant" Name="tvHome">
</TabViewItem>
</TabView>Langage du code : HTML, XML (xml)
Ce contrôle TabView héberge les pages de contenu sur la droite. J’affecte l’instance de la page cible à tvHome depuis le code derrière.
private void MainWindow_Activated(object sender, WindowActivatedEventArgs args)
{
tvHome.Content = new ConsonantsPage();
}Langage du code : JavaScript (javascript)
Des analyses complémentaires ont confirmé que le plantage se produit exactement à la ligne this.DataContext = vm; au sein de la page cible.

J’ai ensuite testé une page vide sans aucun DataContext ni liaison de données, qui se charge sans aucune erreur. La cause racine est donc bien liée à la logique de liaison XAML. Au lieu de continuer à utiliser la liaison MVVM standard, j’ai opté pour une solution de contournement : créer les éléments d’interface directement par programmation dans le code derrière.
Solution finale fonctionnelle :
Créer les contrôles et réaliser les liaisons de valeurs entièrement via le code C# du serveur :
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);
}
}Langage du code : PHP (php)
Je n’ai pas poussé les investigations pour trouver le défaut interne précis, mais je soupçonne que le problème provient de la syntaxe de liaison de commandes telle que Command="{Binding PlayCommand}". Un autre cas de test confirme cette hypothèse : les pages utilisant uniquement des liaisons de propriétés sans liaison de commandes fonctionnent correctement, comme l’exemple ci-dessous.
<Button Content="{Binding}" Grid.Row="0" Grid.Column="1" BorderBrush="#ccc" Foreground="Black" FontSize="50" Height="100" Width="130" Click="Button_Click"/>Langage du code : HTML, XML (xml)
Cette variante fonctionne normalement dans la configuration publication.