MessageBox ل AvaloniaUI

MessageBox - نافذة مفيدة لأطر عمل واجهة المستخدم الرسومية المختلفة ، ولكن لا يمكنك العثور عليها في AvaloniaUI.
دعنا نحاول القيام بذلك.


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

أريد إنشاء lib بسهولة وسهولة كما هو الحال في صندوق رسائل WPF.

لنبدأ


اتصل بهذه الطريقة:

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

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



فئة MessageBox تحتوي على 4 طرق عامة:
ShowForResult - نتيجة إرجاع نقرة الزر.
ShowDialog - إرجاع نتيجة النقر فوق الزر وتعيين هذه النافذة كنافذة حوار للوالد المختار.
إظهار - إظهار نافذة واحدة مع زر "موافق" ، والتي تتجاهل نتيجة النقر (عودة باطلة).
ShowNative - حاول استدعاء النافذة الأصلية للنظام الأساسي ، إذا فشلت ، فاتصل بـ ShowForResult.
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; } 



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

 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 عبر الأنظمة الأساسية.

ممتنة للمستخدم worldbeater .

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


All Articles