معالجة المشكلات الغريبة في تطبيقات WinUI 3

معالجة المشكلات الغريبة في تطبيقات WinUI 3

يعمل تطبيق WinUI 3 بشكل سليم في وضع التصحيح، لكنه يتعطل عند إنشاء نسخة الإصدار النهائي، ويظهر الخطأ الموضح أدناه.

نادرًا ما أواجه مثل هذه المشكلات غير الاعتيادية في عمليات التطوير العادية. يُصدر WinUI 3 في الغالب استثناءات وقت تشغيل داخلية، مما يجعل من الصعب تتبع الأدلة المفيدة من مكدس الاستثناءات.

بعد سلسلة من الاختبارات الاستبعادية، تمكنت من تتبع سبب التعطل إلى مرجع فارغ يحدث أثناء تهيئة نموذج العرض داخل إحدى الصفحات. إليك بنية المشروع: نافذة رئيسية تحتوي على قائمة تنقل جانبية، وعند النقر على عناصر القائمة، يتم تحميل الصفحات المستهدفة في منطقة المحتوى الرئيسية على اليمين. إليك مقتطف كود 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; داخل الصفحة المستهدفة.

بعد ذلك، قمت باختبار صفحة فارغة لا تحتوي على سياق بيانات ولا أي ربط بيانات، وتم تحميلها بنجاح دون أخطاء. لذلك، السبب الجذري يرتبط بشكل مؤكد بمنطق ربط بيانات XAML. بدلاً من الاستمرار في استخدام ربط MVVM القياسي، لجأت إلى حل بديل يتمثل في إنشاء عناصر الواجهة برمجيًا مباشرة ضمن الكود الخلفي.

الحل النهائي الفعال:

قم بإنشاء عناصر التحكم وربط القيم بالكامل من خلال كود 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)

هذا النوع من الكود يعمل بشكل طبيعي في إعدادات الإصدار النهائي.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *