MessageBox es una forma muy utilizada para varios marcos gráficos, pero por alguna razón no encontró un lugar en avalonia, entonces daremos su vida por su cuenta.

Una solución lista para usar, que planeo soportar y actualizar, y me alegrará si alguien se une se puede encontrar en
nuget y
gitlab .
Mi objetivo es acercarme al MsgBox estándar de Windows, al menos en términos de experiencia.
Entonces
Llamamos
MessageBox.ShowForResult("test","Wanna test smth?",MessageBox.MessageBoxButtons.OkCancel);
y obtenemos una ventana preparada con un encabezado y contenido de texto. (Windows 10, Ubuntu 18.04)


La clase MessageBox contiene 3 métodos:
ShowForResult: devuelve el resultado de las pulsaciones de teclas
ShowDialog: devuelve el resultado y crea el cuadro de diálogo MessageBox para la ventana principal seleccionada
Mostrar: muestra una ventana que ignora el resultado de las pulsaciones de teclas
APISe crea una ventana dentro de cualquier método
var messageBox = new MessageBox();
que instala el contenido
messageBox.Content = CreateBaseMsgBox(text, buttons, messageBox);
El contenido en este caso es la cuadrícula, que incluye dos líneas: la primera para el campo 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);
segundo para la cuadrícula anidada con botones:
var btnGrid = GetButtonGrid(GetButton(window, MessageBoxResult.Yes), GetButton(window,MessageBoxResult.No)); Grid.SetRow(btnGrid,1); grid.Children.Add(btnGrid);
Ejemplo completo del método 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; }
Este enfoque dinámico le permite agregar una cantidad ilimitada de botones y expandir las capacidades de MessageBox sin cambios importantes.
La funcionalidad de los botones se establece mediante el método:
GetButton(MessageBox window,MessageBoxResult result)
Más detalles 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 los botones manipularán, y el resultado devuelto por ellos.
Y, lo último a considerar es una pieza 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 varias ventanas simples con botones, que nos permitirán crear MessageBox multiplataforma:

UPD
Se ha agregado un método que intenta llamar a la implementación de ventanas nativas; si no funciona, llama a las ventanas presentadas anteriormente.
Un agradecimiento especial al usuario
worldbeater .