MessageBox — довольно часто используемая форма для различных графических фреймворков, но в авалонии ей почему-то не нашлось места, тогда давайте дадим ей самостоятельную жизнь.
API изменился
Здесь связь к текущему API.
Готовое решение, которое я планирую поддерживать и обновлять и буду рад, если кто-нибудь присоединится, можно найти по адресу Нугет И gitlab .
Моя цель — приблизиться к стандартному Windows MsgBox, хотя бы с точки зрения опыта использования.
Так: Вызов
и получаем готовое окно с заголовком и текстовым содержимым.MessageBox.ShowForResult("test","Wanna test smth?",MessageBox.MessageBoxButtons.OkCancel);
(Виндовс 10, Убунту 18.04)
Класс 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:
УПД
Добавлен метод, который пытается вызвать реализацию собственных окон; в случае неудачи он вызывает окна, представленные выше.
Особая благодарность пользователю победитель мира .
Теги: #C++ #.
NET #.
net core #avalonia #avaloniaui #messagebox
-
Роль Apple Ipad В Будущем
19 Oct, 24 -
Обработка Сложных Событий С Помощью Цепочек
19 Oct, 24 -
Форум «Московская Школа Xxi Века»
19 Oct, 24 -
Двойники Русской Википедии
19 Oct, 24