using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Controls.Primitives;
namespace Microsoft.Windows.Controls
{
[TemplateVisualState(Name = VisualStates.OK, GroupName = VisualStates.MessageBoxButtonsGroup)]
[TemplateVisualState(Name = VisualStates.OKCancel, GroupName = VisualStates.MessageBoxButtonsGroup)]
[TemplateVisualState(Name = VisualStates.YesNo, GroupName = VisualStates.MessageBoxButtonsGroup)]
[TemplateVisualState(Name = VisualStates.YesNoCancel, GroupName = VisualStates.MessageBoxButtonsGroup)]
public class MessageBox : Control
{
#region Private Members
///
/// Tracks the MessageBoxButon value passed into the InitializeContainer method
///
private MessageBoxButton _button = MessageBoxButton.OK;
///
/// Tracks the MessageBoxResult to set as the default and focused button
///
private MessageBoxResult _defaultResult = MessageBoxResult.None;
///
/// Tracks the owner of the MessageBox
///
private Window _owner;
#endregion //Private Members
#region Constructors
static MessageBox()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(MessageBox), new FrameworkPropertyMetadata(typeof(MessageBox)));
}
internal MessageBox()
{ /*user cannot create instance */ }
#endregion //Constructors
#region Properties
#region Protected Properties
///
/// A System.Windows.MessageBoxResult value that specifies which message box button was clicked by the user.
///
protected MessageBoxResult MessageBoxResult = MessageBoxResult.None;
protected Window Container { get; private set; }
protected Thumb DragWidget { get; private set; }
#endregion //Protected Properties
#region Dependency Properties
public static readonly DependencyProperty CaptionProperty = DependencyProperty.Register("Caption", typeof(string), typeof(MessageBox), new UIPropertyMetadata(String.Empty));
public string Caption
{
get { return (string)GetValue(CaptionProperty); }
set { SetValue(CaptionProperty, value); }
}
public static readonly DependencyProperty CaptionForegroundProperty = DependencyProperty.Register("CaptionForeground", typeof(Brush), typeof(MessageBox), new UIPropertyMetadata(null));
public Brush CaptionForeground
{
get { return (Brush)GetValue(CaptionForegroundProperty); }
set { SetValue(CaptionForegroundProperty, value); }
}
public static readonly DependencyProperty CloseButtonStyleProperty = DependencyProperty.Register("CloseButtonStyle", typeof(Style), typeof(MessageBox), new PropertyMetadata(null));
public Style CloseButtonStyle
{
get { return (Style)GetValue(CloseButtonStyleProperty); }
set { SetValue(CloseButtonStyleProperty, value); }
}
public static readonly DependencyProperty ImageSourceProperty = DependencyProperty.Register("ImageSource", typeof(ImageSource), typeof(MessageBox), new UIPropertyMetadata(default(ImageSource)));
public ImageSource ImageSource
{
get { return (ImageSource)GetValue(ImageSourceProperty); }
set { SetValue(ImageSourceProperty, value); }
}
public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(MessageBox), new UIPropertyMetadata(String.Empty));
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
public static readonly DependencyProperty WindowBackgroundProperty = DependencyProperty.Register("WindowBackground", typeof(Brush), typeof(MessageBox), new PropertyMetadata(null));
public Brush WindowBackground
{
get { return (Brush)GetValue(WindowBackgroundProperty); }
set { SetValue(WindowBackgroundProperty, value); }
}
public static readonly DependencyProperty WindowBorderBrushProperty = DependencyProperty.Register("WindowBorderBrush", typeof(Brush), typeof(MessageBox), new PropertyMetadata(null));
public Brush WindowBorderBrush
{
get { return (Brush)GetValue(WindowBorderBrushProperty); }
set { SetValue(WindowBorderBrushProperty, value); }
}
public static readonly DependencyProperty WindowOpacityProperty = DependencyProperty.Register("WindowOpacity", typeof(double), typeof(MessageBox), new PropertyMetadata(null));
public double WindowOpacity
{
get { return (double)GetValue(WindowOpacityProperty); }
set { SetValue(WindowOpacityProperty, value); }
}
#endregion //Dependency Properties
#endregion //Properties
#region Base Class Overrides
///
/// Overrides the OnApplyTemplate method.
///
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
DragWidget = GetTemplateChild("PART_DragWidget") as Thumb;
if (DragWidget != null)
DragWidget.DragDelta += (o, e) => ProcessMove(e);
AddHandler(ButtonBase.ClickEvent, new RoutedEventHandler(Button_Click));
ChangeVisualState(_button.ToString(), true);
SetDefaultResult();
}
#endregion //Base Class Overrides
#region Methods
#region Public Static
///
/// Displays a message box that has a message and that returns a result.
///
/// A System.String that specifies the text to display.
/// A System.Windows.MessageBoxResult value that specifies which message box button is clicked by the user.
public static MessageBoxResult Show(string messageText)
{
return Show(messageText, string.Empty, MessageBoxButton.OK);
}
///
/// Displays a message box that has a message and that returns a result.
///
/// A System.Windows.Window that represents the owner of the MessageBox
/// A System.String that specifies the text to display.
/// A System.Windows.MessageBoxResult value that specifies which message box button is clicked by the user.
public static MessageBoxResult Show(Window owner, string messageText)
{
return Show(owner, messageText, string.Empty, MessageBoxButton.OK);
}
///
/// Displays a message box that has a message and title bar caption; and that returns a result.
///
/// A System.String that specifies the text to display.
/// A System.String that specifies the title bar caption to display.
/// A System.Windows.MessageBoxResult value that specifies which message box button is clicked by the user.
public static MessageBoxResult Show(string messageText, string caption)
{
return Show(messageText, caption, MessageBoxButton.OK);
}
public static MessageBoxResult Show(Window owner, string messageText, string caption)
{
return Show(owner, messageText, caption, MessageBoxButton.OK);
}
///
/// Displays a message box that has a message and that returns a result.
///
/// A System.String that specifies the text to display.
/// A System.String that specifies the title bar caption to display.
/// A System.Windows.MessageBoxButton value that specifies which button or buttons to display.
/// A System.Windows.MessageBoxResult value that specifies which message box button is clicked by the user.
public static MessageBoxResult Show(string messageText, string caption, MessageBoxButton button)
{
return ShowCore(null, messageText, caption, button, MessageBoxImage.None, MessageBoxResult.None);
}
public static MessageBoxResult Show(Window owner, string messageText, string caption, MessageBoxButton button)
{
return ShowCore(owner, messageText, caption, button, MessageBoxImage.None, MessageBoxResult.None);
}
///
/// Displays a message box that has a message and that returns a result.
///
/// A System.String that specifies the text to display.
/// A System.String that specifies the title bar caption to display.
/// A System.Windows.MessageBoxButton value that specifies which button or buttons to display.
/// A System.Windows.MessageBoxImage value that specifies the icon to display.
/// A System.Windows.MessageBoxResult value that specifies which message box button is clicked by the user.
public static MessageBoxResult Show(string messageText, string caption, MessageBoxButton button, MessageBoxImage icon)
{
return ShowCore(null, messageText, caption, button, icon, MessageBoxResult.None);
}
public static MessageBoxResult Show(Window owner, string messageText, string caption, MessageBoxButton button, MessageBoxImage icon)
{
return ShowCore(owner, messageText, caption, button, icon, MessageBoxResult.None);
}
///
/// Displays a message box that has a message and that returns a result.
///
/// A System.String that specifies the text to display.
/// A System.String that specifies the title bar caption to display.
/// A System.Windows.MessageBoxButton value that specifies which button or buttons to display.
/// A System.Windows.MessageBoxImage value that specifies the icon to display.
/// A System.Windows.MessageBoxResult value that specifies the default result of the MessageBox.
/// A System.Windows.MessageBoxResult value that specifies which message box button is clicked by the user.
public static MessageBoxResult Show(string messageText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult)
{
return ShowCore(null, messageText, caption, button, icon, defaultResult);
}
public static MessageBoxResult Show(Window owner, string messageText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult)
{
return ShowCore(owner, messageText, caption, button, icon, defaultResult);
}
#endregion //Public Static
#region Protected
///
/// Shows the container which contains the MessageBox.
///
protected void Show()
{
Container.ShowDialog();
}
///
/// Initializes the MessageBox.
///
/// The text.
/// The caption.
/// The button.
/// The image.
protected void InitializeMessageBox(Window owner, string text, string caption, MessageBoxButton button, MessageBoxImage image, MessageBoxResult defaultResult)
{
Text = text;
Caption = caption;
_button = button;
_defaultResult = defaultResult;
_owner = owner;
SetImageSource(image);
Container = CreateContainer();
}
///
/// Changes the control's visual state(s).
///
/// name of the state
/// True if state transitions should be used.
protected void ChangeVisualState(string name, bool useTransitions)
{
VisualStateManager.GoToState(this, name, useTransitions);
}
#endregion //Protected
#region Private
///
/// Sets the button that represents the _defaultResult to the default button and gives it focus.
///
private void SetDefaultResult()
{
var defaultButton = GetDefaultButtonFromDefaultResult();
if (defaultButton != null)
{
defaultButton.IsDefault = true;
defaultButton.Focus();
}
}
///
/// Gets the default button from the _defaultResult.
///
/// The default button that represents the defaultResult
private Button GetDefaultButtonFromDefaultResult()
{
Button defaultButton = null;
switch (_defaultResult)
{
case MessageBoxResult.Cancel:
defaultButton = GetMessageBoxButton("PART_CancelButton");
break;
case MessageBoxResult.No:
defaultButton = GetMessageBoxButton("PART_NoButton");
break;
case MessageBoxResult.OK:
defaultButton = GetMessageBoxButton("PART_OkButton");
break;
case MessageBoxResult.Yes:
defaultButton = GetMessageBoxButton("PART_YesButton");
break;
case MessageBoxResult.None:
defaultButton = GetDefaultButton();
break;
}
return defaultButton;
}
///
/// Gets the default button.
///
/// Used when the _defaultResult is set to None
/// The button to use as the default
private Button GetDefaultButton()
{
Button defaultButton = null;
switch (_button)
{
case MessageBoxButton.OK:
case MessageBoxButton.OKCancel:
defaultButton = GetMessageBoxButton("PART_OkButton");
break;
case MessageBoxButton.YesNo:
case MessageBoxButton.YesNoCancel:
defaultButton = GetMessageBoxButton("PART_YesButton");
break;
}
return defaultButton;
}
///
/// Gets a message box button.
///
/// The name of the button to get.
/// The button
private Button GetMessageBoxButton(string name)
{
Button button = GetTemplateChild(name) as Button;
return button;
}
///
/// Shows the MessageBox.
///
/// The message text.
/// The caption.
/// The button.
/// The icon.
/// The default result.
///
private static MessageBoxResult ShowCore(Window owner, string messageText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult)
{
MessageBox msgBox = new MessageBox();
msgBox.InitializeMessageBox(owner, messageText, caption, button, icon, defaultResult);
msgBox.Show();
return msgBox.MessageBoxResult;
}
///
/// Resolves the owner Window of the MessageBox.
///
/// the owner Window
private static Window ResolveOwnerWindow()
{
Window owner = null;
if (Application.Current != null)
{
foreach (Window w in Application.Current.Windows)
{
if (w.IsActive)
{
owner = w;
break;
}
}
}
return owner;
}
///
/// Sets the message image source.
///
/// The image to show.
private void SetImageSource(MessageBoxImage image)
{
String iconName = String.Empty;
switch (image)
{
case MessageBoxImage.Error:
{
iconName = "Error48.png";
break;
}
case MessageBoxImage.Information:
{
iconName = "Information48.png";
break;
}
case MessageBoxImage.Question:
{
iconName = "Question48.png";
break;
}
case MessageBoxImage.Warning:
{
iconName = "Warning48.png";
break;
}
case MessageBoxImage.None:
default:
{
return;
}
}
ImageSource = (ImageSource)new ImageSourceConverter().ConvertFromString(String.Format("pack://application:,,,/WPFToolkit.Extended;component/MessageBox/Icons/{0}", iconName));
}
///
/// Creates the container which will host the MessageBox control.
///
///
private Window CreateContainer()
{
var newWindow = new Window();
newWindow.AllowsTransparency = true;
newWindow.Background = Brushes.Transparent;
newWindow.Content = this;
newWindow.Owner = _owner ?? ResolveOwnerWindow();
if (newWindow.Owner != null)
newWindow.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterOwner;
else
newWindow.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen;
newWindow.ShowInTaskbar = false;
newWindow.SizeToContent = System.Windows.SizeToContent.WidthAndHeight;
newWindow.ResizeMode = System.Windows.ResizeMode.NoResize;
newWindow.WindowStyle = System.Windows.WindowStyle.None;
return newWindow;
}
#endregion //Private
#endregion //Methods
#region Event Handlers
///
/// Processes the move of a drag operation on the header.
///
/// The instance containing the event data.
private void ProcessMove(DragDeltaEventArgs e)
{
Container.Left = Container.Left + e.HorizontalChange;
Container.Top = Container.Top + e.VerticalChange;
}
///
/// Sets the MessageBoxResult according to the button pressed and then closes the MessageBox.
///
/// The source of the event.
/// The instance containing the event data.
private void Button_Click(object sender, RoutedEventArgs e)
{
Button button = e.OriginalSource as Button;
switch (button.Name)
{
case "PART_NoButton":
MessageBoxResult = MessageBoxResult.No;
break;
case "PART_YesButton":
MessageBoxResult = MessageBoxResult.Yes;
break;
case "PART_CloseButton":
case "PART_CancelButton":
MessageBoxResult = MessageBoxResult.Cancel;
break;
case "PART_OkButton":
MessageBoxResult = MessageBoxResult.OK;
break;
}
Close();
}
///
/// Closes the MessageBox.
///
private void Close()
{
Container.Close();
}
#endregion //Event Handlers
}
}