MessageBox untuk AvaloniaUI

MessageBox - jendela berguna untuk kerangka kerja GUI yang berbeda, tetapi Anda tidak dapat menemukannya di AvaloniaUI.
Mari kita coba melakukannya.


Solusi, yang ingin saya tingkatkan dan dukung, Anda dapat menemukannya di nuget dan di gitlab . Ini akan senang, jika seseorang membawa ide-ide baru dengan permintaan tariknya.

Saya ingin membuat lib saya semudah dan berguna seperti kotak pesan WPF.

Mari kita mulai


Panggil metode ini:

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

dan dapatkan jendela dengan tajuk, konten (teks) dan dua tombol. (Windows 10, Ubuntu 18.04)



Class MessageBox berisi 4 metode publik:
ShowForResult - mengembalikan hasil klik tombol.
ShowDialog - mengembalikan hasil klik tombol dan mengatur jendela ini sebagai jendela dialog untuk orang tua yang dipilih.
Show - show window dengan satu tombol "ok", yang mengabaikan hasil klik (kembali batal).
ShowNative - coba panggil jendela asli untuk platform, jika gagal, panggil ShowForResult.
API

Cara kerjanya:


Di setiap metode buat jendela,

 var messageBox = new MessageBox(); 

dan mengatur konten untuk masing-masing.

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

Konten adalah kisi, termasuk baris, satu untuk kotak teks:

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

lain untuk kisi dengan tombol:

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

Daftar lengkap untuk 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; } 



Fungsionalitas tombol diberikan oleh metode:

 GetButton(MessageBox window,MessageBoxResult result) 

Baca lebih lanjut
 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; } 


Metode menerima jendela yang dimanipulasi oleh tombol, dan hasilnya dikembalikan oleh mereka.

Dan, hal terakhir yang perlu dipertimbangkan adalah fragmen kode yang memberikan hasil klik tombol:

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

Sebagai hasilnya, kita mendapatkan windows sederhana dengan tombol, yang akan memungkinkan kita untuk membuat MessageBox lintas-platform.

Bersyukur untuk pemakan dunia pengguna.

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


All Articles