This commit is contained in:
NaBian committed 2020-10-03 10:10:12 +08:00
1 parent 46d8e8bc65
commit 4ef70ba91d
5 files changed
+237 -38

No files matched your search

@@ -4,11 +4,14 @@ 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
{
@@ -16,10 +19,29 @@ namespace HandyControl.Controls
/// 消息框
/// </summary>
[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;
@@ -88,9 +110,69 @@ namespace HandyControl.Controls
}, (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)
{
base.OnPreviewKeyDown(e);
if (e.Key == Key.System && e.SystemKey == Key.F4)
{
e.Handled = true;
return;
}
if (e.KeyboardDevice.Modifiers == ModifierKeys.Control && e.Key == Key.C)
{
@@ -108,22 +190,22 @@ namespace HandyControl.Controls
builder.Append(Environment.NewLine);
if (_showOk)
{
builder.Append(Properties.Langs.Lang.Confirm);
builder.Append(Lang.Confirm);
builder.Append(" ");
}
if (_showYes)
{
builder.Append(Properties.Langs.Lang.Yes);
builder.Append(Lang.Yes);
builder.Append(" ");
}
if (_showNo)
{
builder.Append(Properties.Langs.Lang.No);
builder.Append(Lang.No);
builder.Append(" ");
}
if (_showCancel)
{
builder.Append(Properties.Langs.Lang.Cancel);
builder.Append(Lang.Cancel);
builder.Append(" ");
}
builder.Append(Environment.NewLine);
@@ -144,7 +226,7 @@ namespace HandyControl.Controls
Application.Current.Dispatcher.Invoke(new Action(() =>
{
messageBox = CreateMessageBox(null, messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.OK);
SetButtonStatus(messageBox, MessageBoxButton.OK);
SetButtonStatus(messageBox, MessageBoxButton.OK, MessageBoxResult.OK);
messageBox.ShowImage = true;
messageBox.Image = ResourceHelper.GetResource<Geometry>(ResourceToken.SuccessGeometry);
messageBox.ImageBrush = ResourceHelper.GetResource<Brush>(ResourceToken.SuccessBrush);
@@ -166,7 +248,7 @@ namespace HandyControl.Controls
Application.Current.Dispatcher.Invoke(new Action(() =>
{
messageBox = CreateMessageBox(null, messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.Information, MessageBoxResult.OK);
SetButtonStatus(messageBox, MessageBoxButton.OK);
SetButtonStatus(messageBox, MessageBoxButton.OK, MessageBoxResult.OK);
SetImage(messageBox, MessageBoxImage.Information);
SystemSounds.Asterisk.Play();
messageBox.ShowDialog();
@@ -186,7 +268,7 @@ namespace HandyControl.Controls
Application.Current.Dispatcher.Invoke(new Action(() =>
{
messageBox = CreateMessageBox(null, messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK);
SetButtonStatus(messageBox, MessageBoxButton.OK);
SetButtonStatus(messageBox, MessageBoxButton.OK, MessageBoxResult.OK);
SetImage(messageBox, MessageBoxImage.Warning);
SystemSounds.Asterisk.Play();
messageBox.ShowDialog();
@@ -206,7 +288,7 @@ namespace HandyControl.Controls
Application.Current.Dispatcher.Invoke(new Action(() =>
{
messageBox = CreateMessageBox(null, messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
SetButtonStatus(messageBox, MessageBoxButton.OK);
SetButtonStatus(messageBox, MessageBoxButton.OK, MessageBoxResult.OK);
SetImage(messageBox, MessageBoxImage.Error);
SystemSounds.Asterisk.Play();
messageBox.ShowDialog();
@@ -226,7 +308,7 @@ namespace HandyControl.Controls
Application.Current.Dispatcher.Invoke(new Action(() =>
{
messageBox = CreateMessageBox(null, messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.OK);
SetButtonStatus(messageBox, MessageBoxButton.OK);
SetButtonStatus(messageBox, MessageBoxButton.OK, MessageBoxResult.OK);
messageBox.ShowImage = true;
messageBox.Image = ResourceHelper.GetResource<Geometry>(ResourceToken.FatalGeometry);
messageBox.ImageBrush = ResourceHelper.GetResource<Brush>(ResourceToken.PrimaryTextBrush);
@@ -248,7 +330,7 @@ namespace HandyControl.Controls
Application.Current.Dispatcher.Invoke(new Action(() =>
{
messageBox = CreateMessageBox(null, messageBoxText, caption, MessageBoxButton.OKCancel, MessageBoxImage.Question, MessageBoxResult.Cancel);
SetButtonStatus(messageBox, MessageBoxButton.OKCancel);
SetButtonStatus(messageBox, MessageBoxButton.OKCancel, MessageBoxResult.Cancel);
SetImage(messageBox, MessageBoxImage.Question);
SystemSounds.Asterisk.Play();
messageBox.ShowDialog();
@@ -268,7 +350,7 @@ namespace HandyControl.Controls
Application.Current.Dispatcher.Invoke(new Action(() =>
{
messageBox = CreateMessageBox(null, info.Message, info.Caption, info.Button, MessageBoxImage.None, info.DefaultResult);
SetButtonStatus(messageBox, info.Button);
SetButtonStatus(messageBox, info.Button, info.DefaultResult);
if (!string.IsNullOrEmpty(info.IconKey))
{
@@ -318,7 +400,7 @@ namespace HandyControl.Controls
Application.Current.Dispatcher.Invoke(new Action(() =>
{
messageBox = CreateMessageBox(owner, messageBoxText, caption, button, icon, defaultResult);
SetButtonStatus(messageBox, button);
SetButtonStatus(messageBox, button, defaultResult);
SetImage(messageBox, icon);
SystemSounds.Asterisk.Play();
messageBox.ShowDialog();
@@ -363,25 +445,126 @@ namespace HandyControl.Controls
};
}
private static void SetButtonStatus(MessageBox messageBox, MessageBoxButton messageBoxButton)
private static void SetButtonStatus(MessageBox messageBox, MessageBoxButton messageBoxButton, MessageBoxResult defaultResult)
{
switch (messageBoxButton)
{
case MessageBoxButton.OK:
messageBox._showOk = true;
messageBox._buttonOk = new Button
{
IsCancel = true,
IsDefault = true,
Content = Lang.Confirm,
Command = ControlCommands.Confirm,
Style = ResourceHelper.GetResource<Style>("MessageBoxButtonStyle")
};
break;
case MessageBoxButton.OKCancel:
messageBox._showOk = true;
messageBox._buttonOk = new Button
{
Content = Lang.Confirm,
Command = ControlCommands.Confirm
};
messageBox._showCancel = true;
messageBox._buttonCancel = new Button
{
IsCancel = true,
Content = Lang.Cancel,
Command = ControlCommands.Cancel
};
if (defaultResult == MessageBoxResult.Cancel)
{
messageBox._buttonOk.Style = ResourceHelper.GetResource<Style>("MessageBoxButtonStyle");
messageBox._buttonCancel.Style = ResourceHelper.GetResource<Style>("MessageBoxPrimaryButtonStyle");
messageBox._buttonCancel.IsDefault = true;
}
else
{
messageBox._buttonOk.Style = ResourceHelper.GetResource<Style>("MessageBoxPrimaryButtonStyle");
messageBox._buttonOk.IsDefault = true;
messageBox._buttonCancel.Style = ResourceHelper.GetResource<Style>("MessageBoxButtonStyle");
}
break;
case MessageBoxButton.YesNo:
messageBox._showYes = true;
messageBox._buttonYes = new Button
{
Content = Lang.Yes,
Command = ControlCommands.Yes
};
messageBox._showNo = true;
messageBox._buttonNo = new Button
{
Content = Lang.No,
Command = ControlCommands.No
};
if (defaultResult == MessageBoxResult.No)
{
messageBox._buttonYes.Style = ResourceHelper.GetResource<Style>("MessageBoxButtonStyle");
messageBox._buttonNo.Style = ResourceHelper.GetResource<Style>("MessageBoxPrimaryButtonStyle");
messageBox._buttonNo.IsDefault = true;
}
else
{
messageBox._buttonYes.Style = ResourceHelper.GetResource<Style>("MessageBoxPrimaryButtonStyle");
messageBox._buttonYes.IsDefault = true;
messageBox._buttonNo.Style = ResourceHelper.GetResource<Style>("MessageBoxButtonStyle");
}
break;
case MessageBoxButton.YesNoCancel:
messageBox._showYes = true;
messageBox._buttonYes = new Button
{
Content = Lang.Yes,
Command = ControlCommands.Yes
};
messageBox._showNo = true;
messageBox._buttonNo = new Button
{
Content = Lang.No,
Command = ControlCommands.No
};
messageBox._showCancel = true;
messageBox._buttonCancel = new Button
{
IsCancel = true,
Content = Lang.Cancel,
Command = ControlCommands.Cancel
};
if (defaultResult == MessageBoxResult.No)
{
messageBox._buttonYes.Style = ResourceHelper.GetResource<Style>("MessageBoxButtonStyle");
messageBox._buttonNo.Style = ResourceHelper.GetResource<Style>("MessageBoxPrimaryButtonStyle");
messageBox._buttonNo.IsDefault = true;
messageBox._buttonCancel.Style = ResourceHelper.GetResource<Style>("MessageBoxButtonStyle");
}
else if (defaultResult == MessageBoxResult.Cancel)
{
messageBox._buttonYes.Style = ResourceHelper.GetResource<Style>("MessageBoxButtonStyle");
messageBox._buttonNo.Style = ResourceHelper.GetResource<Style>("MessageBoxButtonStyle");
messageBox._buttonCancel.Style = ResourceHelper.GetResource<Style>("MessageBoxPrimaryButtonStyle");
messageBox._buttonCancel.IsDefault = true;
}
else
{
messageBox._buttonYes.Style = ResourceHelper.GetResource<Style>("MessageBoxPrimaryButtonStyle");
messageBox._buttonYes.IsDefault = true;
messageBox._buttonNo.Style = ResourceHelper.GetResource<Style>("MessageBoxButtonStyle");
messageBox._buttonCancel.Style = ResourceHelper.GetResource<Style>("MessageBoxButtonStyle");
}
break;
}
}