การจัดการปัญหาผิดปกติในแอปพลิเคชัน WinUI 3

การจัดการปัญหาผิดปกติในแอปพลิเคชัน WinUI 3

แอป WinUI 3 ทำงานได้ปกติในโหมดดีบัก แต่เกิดการขัดข้องเมื่อสร้างเป็นเวอร์ชันรีลีส โดยมีข้อผิดพลาดดังภาพด้านล่าง

ในงานพัฒนาปกติ ฉันไม่ค่อยพบปัญหาแปลกประเภทนี้เท่าไหร่ ส่วนใหญ่ WinUI 3 จะแสดงข้อยกเว้นรันไทม์ภายใน ทำให้ยากที่จะค้นหาข้อมูลสำคัญจากสแต็กข้อยกเว้น

หลังจากทำการทดสอบกำจัดปัญหาหลายรอบ ฉันพบว่าสาเหตุการขัดข้องเกิดจากการอ้างอิงค่าว่างที่เกิดขึ้นขณะเริ่มต้น ViewModel ภายในหน้าเพจ โครงสร้างโปรเจกต์มีดังนี้ หน้าต่างหลักมีเมนูนำทางด้านข้าง เมื่อกดรายการเมนู จะโหลดหน้าเพจที่ต้องการไปแสดงในพื้นที่เนื้อหาด้านขวา โค้ด XAML ที่ใช้ในหน้าต่างหลักมีดังนี้

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

TabView นี้ใช้แสดงเนื้อหาหน้าเพจทางด้านขวา ฉันกำหนดอินสแตนซ์ของหน้าเพจที่ต้องการให้กับ tvHome ผ่านโค้ดส่วนหลัง

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

การดีบักเพิ่มเติมยืนยันว่าการขัดข้องเกิดขึ้นที่บรรทัดโค้ด this.DataContext = vm; ภายในหน้าเพจเป้าหมาย

จากนั้นฉันทดสอบหน้าเพจเปล่าใหม่ที่ไม่มีการตั้งค่า DataContext และการเชื่อมโยงข้อมูลใดๆ ซึ่งโหลดทำงานได้โดยไม่มีข้อผิดพลาด จึงสรุปได้ว่าสาเหตุหลักเกี่ยวข้องกับตรรกะการเชื่อมโยงข้อมูล XAML ฉันจึงหยุดใช้รูปแบบการเชื่อมโยง MVVM ปกติ แล้วเปลี่ยนไปสร้างองค์ประกอบ UI ผ่านโค้ดส่วนหลังโดยตรงเป็นวิธีแก้ไขชั่วคราว

วิธีแก้ไขที่ใช้งานได้ในที่สุด

สร้างคอนโทรลและเชื่อมโยงค่าทั้งหมดผ่านโค้ด C# ส่วนหลัง

 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);
            }
        }Code language: PHP (php)

ฉันไม่ได้ตรวจสอบปัญหาภายในอย่างละเอียด แต่คาดเดาว่าปัญหามาจากไวยากรณ์การเชื่อมโยงคำสั่ง เช่น Command="{Binding PlayCommand}" ผลการทดสอบอีกกรณีหนึ่งสนับสนุนข้อสันนิษฐานนี้ หน้าเพจที่ใช้เพียงการเชื่อมโยงคุณสมบัติทั่วไป โดยไม่มีการเชื่อมโยงคำสั่ง ทำงานได้ปกติ ดังตัวอย่างโค้ดด้านล่าง

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

รูปแบบการเขียนนี้ทำงานได้ปกติในโหมดรีลีส

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *