Tratamento de problemas incomuns em aplicativos WinUI 3

O aplicativo WinUI 3 funciona corretamente no modo de depuração, mas apresenta falha ao ser compilado na versão de lançamento. O erro é mostrado abaixo.

Raramente encontro problemas estranhos como esse no desenvolvimento convencional. O WinUI 3 geralmente retorna exceções internas de tempo de execução, dificultando a localização de pistas úteis na pilha de exceções.

Após várias rodadas de testes de eliminação, identifiquei que a falha é causada por uma referência nula durante a inicialização do ViewModel dentro de uma página. Confira a estrutura do projeto: uma janela principal com menu de navegação lateral. Ao clicar nos itens do menu, as páginas de destino são carregadas na área de conteúdo principal à direita. Veja o trecho de XAML utilizado na janela principal:

<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)

Esse controle TabView exibe as páginas de conteúdo no lado direito. Atribuo a instância da página de destino ao elemento tvHome por meio do código de retorno:

private void MainWindow_Activated(object sender, WindowActivatedEventArgs args)
{
    tvHome.Content = new ConsonantsPage();
}Code language: JavaScript (javascript)

Depurações adicionais confirmaram que a falha ocorre exatamente na linha this.DataContext = vm; dentro da página de destino.

Em seguida, testei uma página vazia sem DataContext nem vinculação de dados, que carregou perfeitamente sem erros. Portanto, a causa raiz está definitivamente relacionada à lógica de vinculação do XAML. Em vez de continuar usando a vinculação MVVM padrão, adotei uma solução alternativa: criar elementos de interface diretamente por código no arquivo code-behind.

Solução final funcional:

Criar todos os controles e realizar as vinculações de valores totalmente com código C# no back-end:

 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);
            }
        }

Não investiguei a fundo o erro interno exato, mas suspeito que o problema venha da sintaxe de vinculação de comandos como Command="{Binding PlayCommand}". Outro teste comprova essa hipótese: páginas que usam apenas vinculação de propriedades, sem nenhuma vinculação de comando, funcionam sem problemas, conforme o exemplo abaixo:

<Button Content="{Binding}" Grid.Row="0" Grid.Column="1" BorderBrush="#ccc" Foreground="Black" FontSize="50" Height="100" Width="130" Click="Button_Click"/>

Essa forma de escrita funciona normalmente na configuração de lançamento.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *