Messagebox Для Avaloniaui

MessageBox — довольно часто используемая форма для различных графических фреймворков, но в авалонии ей почему-то не нашлось места, тогда давайте дадим ей самостоятельную жизнь.



MessageBox для AvaloniaUI

API изменился Здесь связь к текущему API. Готовое решение, которое я планирую поддерживать и обновлять и буду рад, если кто-нибудь присоединится, можно найти по адресу Нугет И gitlab .

Моя цель — приблизиться к стандартному Windows MsgBox, хотя бы с точки зрения опыта использования.

Так: Вызов

  
  
  
  
  
  
  
  
   

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

и получаем готовое окно с заголовком и текстовым содержимым.

(Виндовс 10, Убунту 18.04)

MessageBox для AvaloniaUI



MessageBox для AvaloniaUI

Класс MessageBox содержит 3 метода: ShowForResult — возвращает результат нажатия клавиш ShowDialog — возвращает результат и превращает MessageBox в диалоговое окно для выбранного родительского окна.

Показать — отображает окно, игнорируя результат нажатия клавиш.

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

Такой динамичный подход позволяет добавлять неограниченное количество кнопок и расширять возможности MessageBox без серьезных изменений.

Функциональность кнопок настраивается следующим способом:

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;

В результате мы получаем различные простые окна с кнопками, которые позволят нам создавать кроссплатформенные MessageBoxes:

MessageBox для AvaloniaUI

УПД Добавлен метод, который пытается вызвать реализацию собственных окон; в случае неудачи он вызывает окна, представленные выше.

Особая благодарность пользователю победитель мира .

Теги: #C++ #.

NET #.

net core #avalonia #avaloniaui #messagebox

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.