前言
在wpf中实现一个MessageBox很容易,但是还是要去编写的,如果每次新建不同的项目都重头编写一个MessageBox还是比较麻烦的,本文的目的是提供一个模板,用于快速实现一个MessageBox。.
一、代码
1、MessageBox.xaml
<Window x:Class="WpfApp1.MessageBox"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"xmlns:local="clr-namespace:WpfApp1"mc:Ignorable="d"Title="MessageBox"AllowsTransparency="True"Background="Transparent"ResizeMode="NoResize"ShowInTaskbar="False"Topmost="True"WindowStartupLocation="CenterScreen"Width="600"Height="260"WindowStyle="None"Closing="Window_Closing"><Viewbox><Grid Width="600" Height="260"><Border Margin="10" Background="White" ><Border.Effect><DropShadowEffect ShadowDepth="0" BlurRadius="10" Opacity="0.5"/></Border.Effect><Grid Margin="20"><TextBlock x:Name="TB_Context" Margin="0,0,0,40" Text="Ensure?" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="48" Foreground="Gray"/><Button VerticalAlignment="Bottom" Content="No" Tag="No" Margin="-174,0,0,0" Height="64" Width="144" Click="No_Button_Click" Cursor="Hand" ><Button.Template><ControlTemplate TargetType="{x:Type Button}"><Border Name="Border" Background="White" BorderBrush="#cccccc" ><Border.Effect><DropShadowEffect ShadowDepth="0" BlurRadius="10" Opacity="0.2"/></Border.Effect><TextBlock Text="{TemplateBinding Content}" FontSize="24" Foreground="Gray" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock></Border></ControlTemplate></Button.Template></Button><Button VerticalAlignment="Bottom" Content="Yes" Tag="Yes" Margin="174,0,0,0" Height="64" Width="144" Click="Yes_Button_Click" Cursor="Hand"><Button.Template><ControlTemplate TargetType="{x:Type Button}"><Border Name="Border" Background="Gray" ><Border.Effect><DropShadowEffect ShadowDepth="0" BlurRadius="10" Opacity="0.2"/></Border.Effect><TextBlock Text="{TemplateBinding Content}" FontSize="24" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock></Border></ControlTemplate></Button.Template></Button></Grid></Border></Grid></Viewbox></Window>
2、MessageBox.xaml.cs
using System;using System.Windows;namespace WpfApp1{public class MessageResult{/// <summary>/// 结果,Yes为true,No为false/// </summary>public bool IsYes { get; set; }}public class MessageBoxEventArgs : EventArgs{/// <summary>/// 结果,Yes为true,No为false/// </summary>public MessageResult Result { get; set; }}/// <summary>/// MessageBox.xaml 的交互逻辑/// </summary>public partial class MessageBox : Window{public event EventHandler<MessageBoxEventArgs> Result;public string Context{get { return TB_Context.Text; }set { TB_Context.Text = value; }}bool _isLegal = false;public MessageBox(){InitializeComponent();}public static void Show(string context, EventHandler<MessageBoxEventArgs> result){var mb = new MessageBox();mb.Context = context;mb.Result += result;mb.Show();}public static MessageResult ShowDialog(string context){var mb = new MessageBox();mb.Context = context;MessageResult r=null;mb.Result += (s,e)=> {r = e.Result;};mb.ShowDialog();return r;}private void No_Button_Click(object sender, RoutedEventArgs e){_isLegal = true;Close();Result?.Invoke(this, new MessageBoxEventArgs() { Result = new MessageResult() { IsYes=false } });}private void Yes_Button_Click(object sender, RoutedEventArgs e){_isLegal = true;Close();Result?.Invoke(this, new MessageBoxEventArgs() { Result = new MessageResult() { IsYes = true} });}private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e){e.Cancel = !_isLegal;}}}
二、效果预览

三、调用方法
异步
MessageBox.Show("Ensure?", (s, e) =>{if (e.Result.IsYes){//选择了Yes}else{//选择了No}});
同步
var r = MessageBox.ShowDialog("Ensure?");if (r.IsYes){//选择了Yes}else{//选择了No}