MessageBox für AvaloniaUI

MessageBox ist eine ziemlich häufig verwendete Form für verschiedene grafische Frameworks, aber aus irgendeinem Grund hat sie keinen Platz in Avalonia gefunden, dann werden wir ihr Leben alleine geben.


Eine fertige Lösung, die ich unterstützen und aktualisieren möchte , und ich bin froh, wenn jemand beitritt, der auf nuget und gitlab zu finden ist .

Mein Ziel ist es, zumindest in Bezug auf die Erfahrung näher an die Standard-Windows-MsgBox heranzukommen.

Also:

Wir rufen an

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

und wir bekommen ein fertiges Fenster mit einer Überschrift und Textinhalt. (Windows 10, Ubuntu 18.04)

Die MessageBox-Klasse enthält drei Methoden:
ShowForResult - gibt das Ergebnis von Tastenanschlägen zurück
ShowDialog - gibt das Ergebnis zurück und erstellt das MessageBox-Dialogfeld für das ausgewählte übergeordnete Fenster
Anzeigen - Zeigt ein Fenster an, in dem das Ergebnis von Tastenanschlägen ignoriert wird
API
Innerhalb einer Methode wird ein Fenster erstellt

 var messageBox = new MessageBox(); 

welches den Inhalt installiert.

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

Der Inhalt in diesem Fall ist das Raster, das zwei Zeilen enthält: die erste für das Textfeld:

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

Sekunde für verschachteltes Gitter mit Schaltflächen:

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

Vollständiges Beispiel für die GetButtonGrid-Methode.
 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; } 

Mit diesem dynamischen Ansatz können Sie eine unbegrenzte Anzahl von Schaltflächen hinzufügen und die Funktionen von MessageBox ohne größere Änderungen erweitern.

Die Funktionalität der Schaltflächen wird durch die folgende Methode festgelegt:

 GetButton(MessageBox window,MessageBoxResult result) 

Weitere Details
 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; } 


Die Methode akzeptiert ein Fenster, das von den Schaltflächen bearbeitet wird, und das von ihnen zurückgegebene Ergebnis.

Und das Letzte, was zu berücksichtigen ist, ist ein Code, der das Ergebnis eines Klickens auf die Schaltfläche liefert:

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

Als Ergebnis erhalten wir verschiedene einfache Fenster mit Schaltflächen, mit denen wir plattformübergreifende MessageBox erstellen können:



UPD
Es wurde eine Methode hinzugefügt, die versucht, die Implementierung nativer Fenster aufzurufen. Wenn dies nicht funktioniert, werden die oben dargestellten Fenster aufgerufen.

Besonderer Dank geht an den User Worldbeater .

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


All Articles