AvaloniaUI的MessageBox

MessageBox-用于不同GUI框架的有用窗口,但是您无法在AvaloniaUI中找到它。
让我们尝试去做。


我想改进和支持的解决方案,可以在nugetgitlab找到 。 如果有人提出新的想法,他/她会很高兴。

我想创建我的库,就像WPF的消息框一样容易和有用。

让我们开始吧


调用此方法:

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

并获得带有标题,内容(文本)和两个按钮的窗口。 (Windows 10,Ubuntu 18.04)



MessageBox类包含4种公共方法:
ShowForResult-返回按钮单击的结果。
ShowDialog-返回按钮单击的结果,并将此窗口设置为所选父对象的对话框窗口。
显示-显示带有一个“确定”按钮的窗口,忽略单击结果(返回无效)。
ShowNative-尝试调用平台的本机窗口,如果失败,则调用ShowForResult。
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; } 



按钮的功能由方法给出:

 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。

感谢用户worldbeater

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


All Articles