[英]How can I make a custom popup likes a WPF MessageBox without using await/async to get its result?
你可以这样做:
public partial class CustomMessageBox
{
private MessageBoxResult? _result;
private CustomMessageBox()
{
InitializeComponent();
}
public static MessageBoxResult? Show(string message)
{
return Show(message, "Message", MessageBoxButton.OK);
}
public static MessageBoxResult? Show(string message, string caption)
{
return Show(message, caption, MessageBoxButton.OK);
}
public static MessageBoxResult? Show(string message, string caption, MessageBoxButton buttons)
{
var box = new CustomMessageBox();
box.TbMessage.Text = message;
box.BtnCancel.Visibility = Visibility.Collapsed;
box.BtnYesNoCancel.Visibility = Visibility.Collapsed;
box.BtnOk.Visibility = Visibility.Collapsed;
box.BtnYes.Visibility = Visibility.Collapsed;
box.BtnNo.Visibility = Visibility.Collapsed;
switch (buttons)
{
case MessageBoxButton.OK:
box.BtnOk.Visibility = Visibility.Visible;
break;
case MessageBoxButton.OKCancel:
box.BtnCancel.Visibility = Visibility.Visible;
box.BtnOk.Visibility = Visibility.Visible;
break;
case MessageBoxButton.YesNoCancel:
box.BtnCancel.Visibility = Visibility.Visible;
box.BtnYes.Visibility = Visibility.Visible;
box.BtnYesNoCancel.Visibility = Visibility.Visible;
box.BtnNo.Visibility = Visibility.Visible;
break;
case MessageBoxButton.YesNo:
box.BtnYes.Visibility = Visibility.Visible;
box.BtnNo.Visibility = Visibility.Visible;
break;
default:
throw new ArgumentOutOfRangeException(nameof(buttons), buttons, null);
}
box.ShowDialog();
return box._result;
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
if (ReferenceEquals(sender, BtnYes))
{
_result = MessageBoxResult.Yes;
}
if (ReferenceEquals(sender, BtnNo))
{
_result = MessageBoxResult.No;
}
if (ReferenceEquals(sender, BtnOk))
{
_result = MessageBoxResult.OK;
}
if (ReferenceEquals(sender, BtnCancel) || ReferenceEquals(sender, BtnYesNoCancel))
{
_result = MessageBoxResult.Cancel;
}
Close();
}
}
和 XAML
<Window x:Class="StackOverflow.Views.CustomMessageBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="Message"
MinHeight="95"
MinWidth="280"
SizeToContent="WidthAndHeight"
MaxHeight="500"
MaxWidth="600"
WindowStartupLocation="CenterScreen">
<DockPanel LastChildFill="True" Margin="10">
<TextBlock x:Name="TbMessage" TextAlignment="Left" VerticalAlignment="Top" TextWrapping="WrapWithOverflow"
HorizontalAlignment="Left" DockPanel.Dock="Top"/>
<StackPanel Orientation="Horizontal" DockPanel.Dock="Top" VerticalAlignment="Bottom" HorizontalAlignment="Right">
<Button Content="OK" Click="ButtonBase_OnClick" Width="50" x:Name="BtnOk"/>
<Button Content="Cancel" Click="ButtonBase_OnClick" Width="80" Margin="10 0 0 0" x:Name="BtnCancel"/>
<Button Content="Yes" Click="ButtonBase_OnClick" Margin="0 0 10 0" Width="50" x:Name="BtnYes" />
<Button Content="No" Click="ButtonBase_OnClick" Width="50" x:Name="BtnNo" />
<Button Content="Cancel" Click="ButtonBase_OnClick" Width="80" Margin="10 0 0 0" x:Name="BtnYesNoCancel"/>
</StackPanel>
</DockPanel>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.