处理Winui3的程序遇到一个很诡异的问题

winui3 在debug模式下面 可以运行 在release下 异常,异常信息如下:

以往开发,很少遇到这样的问题,而且对于winui3的程序,抛出的异常都是内部的,很难从异常堆栈中获取到有用的信息。

经过不断排除法,发现是Page页面,在初始化Viewmodel的时候,抛出空指针异常。先说明一下,我的项目是winui3,一个主窗体,左侧栏是一个菜单栏,点击菜单栏,然后右侧中间正文部分,就是一个page,主窗体中用如下代码:

<TabView Name="tabView" IsAddTabButtonVisible="False" Margin="10" VerticalAlignment="Stretch" TabCloseRequested="TabView_TabCloseRequested">
    <TabViewItem x:Uid="tabConsonant" Name="tvHome">
    </TabViewItem>
</TabView>

以上代码就算显示右侧的页面的,然后在后台代码中,初始化tvHome就可以,

private void MainWindow_Activated(object sender, WindowActivatedEventArgs args)
{
    tvHome.Content = new ConsonantsPage();
}

然后,继续追查,发现就是Page里面,发现是 Page里面的 this.DataContext = vm;错误

然后我尝试,打开一个非绑定,没有datacontext的页面,发现可以正常打开,最终,可以肯定和数据绑定binding有关系了。所以,可能需要另辟蹊径,不适用绑定了,直接在xaml中,初始化。

最终解决方案:

直接后台创建控件绑定

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

至于,真正问题是哪里,我没有继续排查,估计和Command=”{Binding PlayCommand}” 这种绑定有关系的。读者,如果遇到同样的问题,可以从这个入手,为什么我这么肯定,因为我有另外一个,也使用到了数据绑定的,但是没用到command。直接如下

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

就可以正常运行。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注