MessageBox ل AvaloniaUI

إن MessageBox هو نموذج يستخدم في كثير من الأحيان لمختلف أطر الرسوم ، لكن لسبب ما لم تجد مكانًا في avalonia ، فسنمنحها حياتها بمفردها.


حل جاهز ، أخطط لدعمه وتحديثه ، وسأكون سعيدًا إذا كان يمكن لأي شخص الانضمام إلى nuget و gitlab .

هدفي هو الاقتراب من Windows MsgBox القياسي ، على الأقل من حيث الخبرة.

لذلك:

نحن ندعو

MessageBox.ShowForResult("test","Wanna test smth?",MessageBox.MessageBoxButtons.OkCancel); 

ونحصل على نافذة جاهزة مع عنوان ومحتوى النص. (ويندوز 10 ، أوبونتو 18.04)

تحتوي فئة MessageBox على 3 طرق:
ShowForResult - إرجاع نتيجة ضغطات المفاتيح
يعرض ShowDialog - النتيجة ويجعل مربع حوار MessageBox للإطار الأصل المحدد
إظهار - يعرض نافذة تتجاهل نتيجة ضغطات المفاتيح
API
يتم إنشاء نافذة داخل أي طريقة

 var messageBox = new MessageBox(); 

الذي يثبت المحتوى.

  messageBox.Content = CreateBaseMsgBox(text, buttons, messageBox); 

المحتوى في هذه الحالة هو الشبكة ، والذي يتضمن سطرين: الأول لحقل النص:

  var textBlock = new TextBlock(); textBlock.Text = text; textBlock.TextAlignment = TextAlignment.Center; textBlock.TextWrapping = TextWrapping.Wrap; Grid.SetRow(textBlock,0); grid.Children.Add(textBlock); 

الثانية لشبكة متداخلة مع أزرار:

 var btnGrid = GetButtonGrid(GetButton(window, MessageBoxResult.Yes), GetButton(window,MessageBoxResult.No)); Grid.SetRow(btnGrid,1); grid.Children.Add(btnGrid); 

المثال الكامل للأسلوب GetButtonGrid.
 private static Grid GetButtonGrid(params Button[] buttons) { var grid = new Grid(); List<ColumnDefinition> definitions = new List<ColumnDefinition>(); for (int i = 0; i < buttons.Length; i++) { definitions.Add(new ColumnDefinition{Width = new GridLength(5)}); definitions.Add(new ColumnDefinition{Width = new GridLength(1,GridUnitType.Star)}); } definitions.Add(new ColumnDefinition{Width = new GridLength(5)}); grid.ColumnDefinitions.AddRange(definitions); var j = 1; foreach (var btn in buttons) { Grid.SetColumn(btn,j); j += 2; grid.Children.Add(btn); } return grid; } 

يتيح لك هذا الأسلوب الديناميكي إضافة عدد غير محدود من الأزرار وتوسيع إمكانيات MessageBox دون تغييرات كبيرة.

يتم تعيين وظيفة الأزرار حسب الطريقة:

 GetButton(MessageBox window,MessageBoxResult result) 

مزيد من التفاصيل
 private static Button GetButton(MessageBox window,MessageBoxResult result) { var btn = new Button(); btn.Content = result.ToString(); btn.Click += (_, __) => { window.Res = result; window.Close(); }; return btn; } 


تقبل الطريقة نافذة ستتعامل معها الأزرار والنتيجة التي يتم إرجاعها بها.

وآخر شيء يجب مراعاته هو جزء من الكود يوفر نتيجة النقر على زر:

 var tcs = new TaskCompletionSource<MessageBoxResult>(); messageBox.Closed += delegate { tcs.TrySetResult(messageBox.Res); }; ... return tcs.Task; 

نتيجة لذلك ، نحصل على العديد من النوافذ البسيطة المزودة بأزرار ، مما سيتيح لنا إنشاء MessageBox عبر الأنظمة الأساسية:



UPD
تمت إضافة طريقة تحاول تنفيذ تطبيق الإطارات الأصلية ، إذا لم يتم التعامل معها ، فإنها تستدعي النوافذ المعروضة أعلاه.

شكر خاص للمستخدم worldbeater .

Source: https://habr.com/ru/post/ar452818/


All Articles