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

我计划支持和更新一个现成的解决方案,如果在
nuget和
gitlab上可以找到任何人加入,我将感到高兴。
我的目标是至少在经验上更接近标准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 。