MessageBox para AvaloniaUI

MessageBox: ventana útil para diferentes marcos de GUI, pero no puede encontrarla en AvaloniaUI.
Intentemos hacerlo.


Solución, que quiero mejorar y apoyar, puedes encontrar en nuget y en gitlab . Se alegrará si alguien aporta nuevas ideas con sus solicitudes de extracción.

Quiero crear mi lib tan fácil y útil como lo es el cuadro de mensajes de WPF.

Empecemos


Llama a este método:

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

y obtenga una ventana con encabezado, contenido (texto) y dos botones. (Windows 10, Ubuntu 18.04)



Class MessageBox contiene 4 métodos públicos:
ShowForResult - devuelve el resultado del clic del botón.
ShowDialog: devuelve el resultado del clic del botón y establece esta ventana como ventana de diálogo para el elemento primario elegido.
Mostrar - muestra la ventana con un botón "ok", que ignora el resultado del clic (retorno nulo).
ShowNative: intente llamar a la ventana nativa de la plataforma; si falla, llame a ShowForResult.
API

Cómo funciona


En cada método crear ventana,

 var messageBox = new MessageBox(); 

y establecer contenido para cada uno.

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

El contenido es una cuadrícula, que incluye filas, una para el cuadro de texto:

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

otro para cuadrícula con botones:

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

Listado completo para 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; } 



La funcionalidad de los botones viene dada por el método:

 GetButton(MessageBox window,MessageBoxResult result) 

Leer mas
 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; } 


El método acepta una ventana que se manipula mediante botones y el resultado devuelto por ellos.

Y, lo último a considerar es un fragmento de código que proporciona el resultado de un clic en un botón:

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

Como resultado, obtenemos ventanas simples con botones, que nos permitirán crear MessageBox multiplataforma.

Agradecido por el usuario worldbeater .

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


All Articles