using System.ComponentModel; using System.Linq; using System.Windows; using System.Windows.Input; using System.Windows.Media; using HandyControl.Data; using HandyControl.Interactivity; using HandyControl.Tools; namespace HandyControl.Controls { /// /// 消息框 /// public sealed class MessageBox : Window { private MessageBoxResult _messageBoxResult = MessageBoxResult.Cancel; private bool _showOk; private bool _showCancel; private bool _showYes; private bool _showNo; public static readonly DependencyProperty MessageProperty = DependencyProperty.Register( "Message", typeof(string), typeof(MessageBox), new PropertyMetadata(default(string))); public string Message { get => (string) GetValue(MessageProperty); set => SetValue(MessageProperty, value); } public static readonly DependencyProperty ImageProperty = DependencyProperty.Register( "Image", typeof(Geometry), typeof(MessageBox), new PropertyMetadata(default(Geometry))); public Geometry Image { get => (Geometry) GetValue(ImageProperty); set => SetValue(ImageProperty, value); } public static readonly DependencyProperty ImageBrushProperty = DependencyProperty.Register( "ImageBrush", typeof(Brush), typeof(MessageBox), new PropertyMetadata(default(Brush))); public Brush ImageBrush { get => (Brush) GetValue(ImageBrushProperty); set => SetValue(ImageBrushProperty, value); } public static readonly DependencyProperty ShowImageProperty = DependencyProperty.Register( "ShowImage", typeof(bool), typeof(MessageBox), new PropertyMetadata(ValueBoxes.FalseBox)); public bool ShowImage { get => (bool) GetValue(ShowImageProperty); set => SetValue(ShowImageProperty, value); } private MessageBox() { CommandBindings.Add(new CommandBinding(ControlCommands.Confirm, (s, e) => { _messageBoxResult = MessageBoxResult.OK; Close(); }, (s, e) => e.CanExecute = _showOk)); CommandBindings.Add(new CommandBinding(ControlCommands.Cancel, (s, e) => { _messageBoxResult = MessageBoxResult.Cancel; Close(); }, (s, e) => e.CanExecute = _showCancel)); CommandBindings.Add(new CommandBinding(ControlCommands.Yes, (s, e) => { _messageBoxResult = MessageBoxResult.Yes; Close(); }, (s, e) => e.CanExecute = _showYes)); CommandBindings.Add(new CommandBinding(ControlCommands.No, (s, e) => { _messageBoxResult = MessageBoxResult.No; Close(); }, (s, e) => e.CanExecute = _showNo)); } /// /// 成功 /// /// /// public static MessageBoxResult Success(string messageBoxText, string caption = null) { var messageBox = CreateMessageBox(null, messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.OK); SetButtonStatus(messageBox, MessageBoxButton.OK); messageBox.ShowImage = true; messageBox.Image = ResourceHelper.GetResource(ResourceToken.SuccessGeometry); messageBox.ImageBrush = ResourceHelper.GetResource(ResourceToken.SuccessBrush); messageBox.ShowDialog(); return messageBox._messageBoxResult; } /// /// 消息 /// /// /// public static MessageBoxResult Info(string messageBoxText, string caption = null) { var messageBox = CreateMessageBox(null, messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.Information, MessageBoxResult.OK); SetButtonStatus(messageBox, MessageBoxButton.OK); SetImage(messageBox, MessageBoxImage.Information); messageBox.ShowDialog(); return messageBox._messageBoxResult; } /// /// 警告 /// /// /// public static MessageBoxResult Warning(string messageBoxText, string caption = null) { var messageBox = CreateMessageBox(null, messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK); SetButtonStatus(messageBox, MessageBoxButton.OK); SetImage(messageBox, MessageBoxImage.Warning); messageBox.ShowDialog(); return messageBox._messageBoxResult; } /// /// 错误 /// /// /// public static MessageBoxResult Error(string messageBoxText, string caption = null) { var messageBox = CreateMessageBox(null, messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK); SetButtonStatus(messageBox, MessageBoxButton.OK); SetImage(messageBox, MessageBoxImage.Error); messageBox.ShowDialog(); return messageBox._messageBoxResult; } /// /// 严重 /// /// /// public static MessageBoxResult Fatal(string messageBoxText, string caption = null) { var messageBox = CreateMessageBox(null, messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.OK); SetButtonStatus(messageBox, MessageBoxButton.OK); messageBox.ShowImage = true; messageBox.Image = ResourceHelper.GetResource(ResourceToken.FatalGeometry); messageBox.ImageBrush = ResourceHelper.GetResource(ResourceToken.PrimaryTextBrush); messageBox.ShowDialog(); return messageBox._messageBoxResult; } /// /// 询问 /// /// /// public static MessageBoxResult Ask(string messageBoxText, string caption = null) { var messageBox = CreateMessageBox(null, messageBoxText, caption, MessageBoxButton.OKCancel, MessageBoxImage.Question, MessageBoxResult.Cancel); SetButtonStatus(messageBox, MessageBoxButton.OKCancel); SetImage(messageBox, MessageBoxImage.Question); messageBox.ShowDialog(); return messageBox._messageBoxResult; } public static MessageBoxResult CustomShow(string messageBoxText, string caption = null, MessageBoxButton button = MessageBoxButton.OK, string iconKey = "", string iconBrushKey = "", MessageBoxResult defaultResult = MessageBoxResult.None) { var messageBox = CreateMessageBox(null, messageBoxText, caption, button, MessageBoxImage.None, defaultResult); messageBox.ShowImage = true; messageBox.Image = ResourceHelper.GetResource(iconKey); messageBox.ImageBrush = ResourceHelper.GetResource(iconBrushKey); messageBox.ShowDialog(); return messageBox._messageBoxResult; } public static MessageBoxResult Show(string messageBoxText, string caption = null, MessageBoxButton button = MessageBoxButton.OK, MessageBoxImage icon = MessageBoxImage.None, MessageBoxResult defaultResult = MessageBoxResult.None) { return Show(null, messageBoxText, caption, button, icon, defaultResult); } public static MessageBoxResult Show(System.Windows.Window owner, string messageBoxText, string caption = null, MessageBoxButton button = MessageBoxButton.OK, MessageBoxImage icon = MessageBoxImage.None, MessageBoxResult defaultResult = MessageBoxResult.None) { var messageBox = CreateMessageBox(owner, messageBoxText, caption, button, icon, defaultResult); SetButtonStatus(messageBox, button); SetImage(messageBox, icon); messageBox.ShowDialog(); return messageBox._messageBoxResult; } private static MessageBox CreateMessageBox( System.Windows.Window owner, string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult) { if (!IsValidMessageBoxButton(button)) { throw new InvalidEnumArgumentException(nameof(button), (int)button, typeof(MessageBoxButton)); } if (!IsValidMessageBoxImage(icon)) { throw new InvalidEnumArgumentException(nameof(icon), (int)icon, typeof(MessageBoxImage)); } if (!IsValidMessageBoxResult(defaultResult)) { throw new InvalidEnumArgumentException(nameof(defaultResult), (int)defaultResult, typeof(MessageBoxResult)); } var ownerWindow = owner ?? Application.Current.Windows.OfType().SingleOrDefault(x => x.IsActive); var ownerIsNull = ownerWindow is null; return new MessageBox { Message = messageBoxText, Owner = ownerWindow, WindowStartupLocation = ownerIsNull ? WindowStartupLocation.CenterScreen : WindowStartupLocation.CenterOwner, ShowTitle = true, Title = caption, Topmost = ownerIsNull, _messageBoxResult = defaultResult }; } private static void SetButtonStatus(MessageBox messageBox, MessageBoxButton messageBoxButton) { switch (messageBoxButton) { case MessageBoxButton.OK: messageBox._showOk = true; break; case MessageBoxButton.OKCancel: messageBox._showOk = true; messageBox._showCancel = true; break; case MessageBoxButton.YesNo: messageBox._showYes = true; messageBox._showNo = true; break; case MessageBoxButton.YesNoCancel: messageBox._showYes = true; messageBox._showNo = true; messageBox._showCancel = true; break; } } private static void SetImage(MessageBox messageBox, MessageBoxImage messageBoxImage) { var iconKey = string.Empty; var iconBrushKey = string.Empty; switch (messageBoxImage) { case MessageBoxImage.Error: iconKey = ResourceToken.ErrorGeometry; iconBrushKey = ResourceToken.DangerBrush; break; case MessageBoxImage.Question: iconKey = ResourceToken.AskGeometry; iconBrushKey = ResourceToken.AccentBrush; break; case MessageBoxImage.Warning: iconKey = ResourceToken.WarningGeometry; iconBrushKey = ResourceToken.WarningBrush; break; case MessageBoxImage.Information: iconKey = ResourceToken.InfoGeometry; iconBrushKey = ResourceToken.InfoBrush; break; } if (string.IsNullOrEmpty(iconKey)) return; messageBox.ShowImage = true; messageBox.Image = ResourceHelper.GetResource(iconKey); messageBox.ImageBrush = ResourceHelper.GetResource(iconBrushKey); } private static bool IsValidMessageBoxButton(MessageBoxButton value) { return value == MessageBoxButton.OK || value == MessageBoxButton.OKCancel || value == MessageBoxButton.YesNo || value == MessageBoxButton.YesNoCancel; } private static bool IsValidMessageBoxImage(MessageBoxImage value) { return value == MessageBoxImage.Asterisk || value == MessageBoxImage.Error || value == MessageBoxImage.Exclamation || value == MessageBoxImage.Hand || value == MessageBoxImage.Information || value == MessageBoxImage.None || value == MessageBoxImage.Question || value == MessageBoxImage.Stop || value == MessageBoxImage.Warning; } private static bool IsValidMessageBoxResult(MessageBoxResult value) { return value == MessageBoxResult.Cancel || value == MessageBoxResult.No || value == MessageBoxResult.None || value == MessageBoxResult.OK || value == MessageBoxResult.Yes; } } }