AvaloniaUI的MessageBox

MessageBox是用于各种图形框架的一种非常常用的形式,但是由于某种原因,她没有在雪茄中找到自己的位置,那么我们将独自生活。


我计划支持和更新一个现成的解决方案,如果在nugetgitlab上可以找到任何人加入,我将感到高兴。

我的目标是至少在经验上更接近标准Windows MsgBox。

因此:

我们打电话

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

然后我们将获得一个包含标题和文本内容的现成窗口。 (Windows 10,Ubuntu 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; 

结果,我们得到了带有按钮的各种简单窗口,这将使我们能够创建跨平台的MessageBox:



UPD
添加了一种方法,该方法尝试调用本机窗口的实现,如果无法解决,则将调用上述窗口。

特别感谢用户worldbeater

Source: https://habr.com/ru/post/zh-CN452818/


All Articles