using System; using System.ComponentModel; using System.Diagnostics.CodeAnalysis; using System.Media; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; using HandyControl.Data; using HandyControl.Interactivity; using HandyControl.Properties.Langs; using HandyControl.Tools; using HandyControl.Tools.Interop; namespace HandyControl.Controls { /// /// 消息框 /// [SuppressMessage("ReSharper", "RedundantDelegateCreation")] [TemplatePart(Name = ElementPanel, Type = typeof(Panel))] [TemplatePart(Name = ElementButtonClose, Type = typeof(Button))] public sealed class MessageBox : Window { private const string ElementPanel = "PART_Panel"; private const string ElementButtonClose = "PART_ButtonClose"; private Button _buttonClose; private Panel _panel; private MessageBoxResult _messageBoxResult = MessageBoxResult.Cancel; private Button _buttonOk; private Button _buttonCancel; private Button _buttonYes; private Button _buttonNo; 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, ValueBoxes.BooleanBox(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)); } protected override void OnSourceInitialized(EventArgs e) { if (_showYes && !_showCancel) { var hMenu = InteropMethods.GetSystemMenu(this.GetHandle(), false); if (hMenu != IntPtr.Zero) { InteropMethods.EnableMenuItem(hMenu, InteropValues.SC_CLOSE, InteropValues.MF_BYCOMMAND | InteropValues.MF_GRAYED); } if (_buttonClose != null) { _buttonClose.IsEnabled = false; } } base.OnSourceInitialized(e); } public override void OnApplyTemplate() { base.OnApplyTemplate(); _panel = GetTemplateChild(ElementPanel) as Panel; if (_panel != null) { if (_buttonOk != null) { _panel.Children.Add(_buttonOk); } if (_buttonYes != null) { _panel.Children.Add(_buttonYes); } if (_buttonNo != null) { _panel.Children.Add(_buttonNo); } if (_buttonCancel != null) { _panel.Children.Add(_buttonCancel); } } _buttonClose = GetTemplateChild(ElementButtonClose) as Button; if (_buttonClose != null) { _buttonClose.Click += ButtonClose_Click; } } private void ButtonClose_Click(object sender, RoutedEventArgs e) => Close(); protected override void OnPreviewKeyDown(KeyEventArgs e) { if (e.Key == Key.System && e.SystemKey == Key.F4) { e.Handled = true; return; } if (e.KeyboardDevice.Modifiers == ModifierKeys.Control && e.Key == Key.C) { var builder = new StringBuilder(); var line = new string('-', 27); builder.Append(line); builder.Append(Environment.NewLine); builder.Append(Title); builder.Append(Environment.NewLine); builder.Append(line); builder.Append(Environment.NewLine); builder.Append(Message); builder.Append(Environment.NewLine); builder.Append(line); builder.Append(Environment.NewLine); if (_showOk) { builder.Append(Lang.Confirm); builder.Append(" "); } if (_showYes) { builder.Append(Lang.Yes); builder.Append(" "); } if (_showNo) { builder.Append(Lang.No); builder.Append(" "); } if (_showCancel) { builder.Append(Lang.Cancel); builder.Append(" "); } builder.Append(Environment.NewLine); builder.Append(line); builder.Append(Environment.NewLine); Clipboard.SetText(builder.ToString()); } } /// /// 成功 /// /// /// public static MessageBoxResult Success(string messageBoxText, string caption = null) { MessageBox messageBox = null; Application.Current.Dispatcher.Invoke(new Action(() => { messageBox = CreateMessageBox(null, messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.OK); SetButtonStatus(messageBox, MessageBoxButton.OK, MessageBoxResult.OK); messageBox.ShowImage = true; messageBox.Image = ResourceHelper.GetResource(ResourceToken.SuccessGeometry); messageBox.ImageBrush = ResourceHelper.GetResource(ResourceToken.SuccessBrush); SystemSounds.Asterisk.Play(); messageBox.ShowDialog(); })); return messageBox._messageBoxResult; } /// /// 消息 /// /// /// public static MessageBoxResult Info(string messageBoxText, string caption = null) { MessageBox messageBox = null; Application.Current.Dispatcher.Invoke(new Action(() => { messageBox = CreateMessageBox(null, messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.Information, MessageBoxResult.OK); SetButtonStatus(messageBox, MessageBoxButton.OK, MessageBoxResult.OK); SetImage(messageBox, MessageBoxImage.Information); SystemSounds.Asterisk.Play(); messageBox.ShowDialog(); })); return messageBox._messageBoxResult; } /// /// 警告 /// /// /// public static MessageBoxResult Warning(string messageBoxText, string caption = null) { MessageBox messageBox = null; Application.Current.Dispatcher.Invoke(new Action(() => { messageBox = CreateMessageBox(null, messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK); SetButtonStatus(messageBox, MessageBoxButton.OK, MessageBoxResult.OK); SetImage(messageBox, MessageBoxImage.Warning); SystemSounds.Asterisk.Play(); messageBox.ShowDialog(); })); return messageBox._messageBoxResult; } /// /// 错误 /// /// /// public static MessageBoxResult Error(string messageBoxText, string caption = null) { MessageBox messageBox = null; Application.Current.Dispatcher.Invoke(new Action(() => { messageBox = CreateMessageBox(null, messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK); SetButtonStatus(messageBox, MessageBoxButton.OK, MessageBoxResult.OK); SetImage(messageBox, MessageBoxImage.Error); SystemSounds.Asterisk.Play(); messageBox.ShowDialog(); })); return messageBox._messageBoxResult; } /// /// 严重 /// /// /// public static MessageBoxResult Fatal(string messageBoxText, string caption = null) { MessageBox messageBox = null; Application.Current.Dispatcher.Invoke(new Action(() => { messageBox = CreateMessageBox(null, messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.OK); SetButtonStatus(messageBox, MessageBoxButton.OK, MessageBoxResult.OK); messageBox.ShowImage = true; messageBox.Image = ResourceHelper.GetResource(ResourceToken.FatalGeometry); messageBox.ImageBrush = ResourceHelper.GetResource(ResourceToken.PrimaryTextBrush); SystemSounds.Asterisk.Play(); messageBox.ShowDialog(); })); return messageBox._messageBoxResult; } /// /// 询问 /// /// /// public static MessageBoxResult Ask(string messageBoxText, string caption = null) { MessageBox messageBox = null; Application.Current.Dispatcher.Invoke(new Action(() => { messageBox = CreateMessageBox(null, messageBoxText, caption, MessageBoxButton.OKCancel, MessageBoxImage.Question, MessageBoxResult.Cancel); SetButtonStatus(messageBox, MessageBoxButton.OKCancel, MessageBoxResult.Cancel); SetImage(messageBox, MessageBoxImage.Question); SystemSounds.Asterisk.Play(); messageBox.ShowDialog(); })); return messageBox._messageBoxResult; } /// /// 自定义信息展示 /// /// /// public static MessageBoxResult Show(MessageBoxInfo info) { MessageBox messageBox = null; Application.Current.Dispatcher.Invoke(new Action(() => { messageBox = CreateMessageBox(null, info.Message, info.Caption, info.Button, MessageBoxImage.None, info.DefaultResult); SetButtonStatus(messageBox, info.Button, info.DefaultResult); if (!string.IsNullOrEmpty(info.IconKey)) { messageBox.ShowImage = true; messageBox.Image = ResourceHelper.GetResource(info.IconKey); messageBox.ImageBrush = ResourceHelper.GetResource(info.IconBrushKey); } if (info.StyleKey != null) { messageBox.Style = ResourceHelper.GetResource