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; #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; } protected Button CloseButton { get; private set; } protected Button OkButton { get; private set; } protected Button CancelButton { get; private set; } protected Button YesButton { get; private set; } protected Button NoButton { get; private set; } protected Button OkButton1 { get; private set; } protected Button CancelButton1 { get; private set; } protected Button YesButton1 { get; private set; } protected Button NoButton1 { 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 = (Thumb)GetTemplateChild("PART_DragWidget"); if (DragWidget != null) DragWidget.DragDelta += (o, e) => ProcessMove(e); CloseButton = (Button)GetTemplateChild("PART_CloseButton"); if (CloseButton != null) CloseButton.Click += (o, e) => Close(); NoButton = (Button)GetTemplateChild("PART_NoButton"); if (NoButton != null) NoButton.Click += (o, e) => Button_Click(o, e); NoButton1 = (Button)GetTemplateChild("PART_NoButton1"); if (NoButton1 != null) NoButton1.Click += (o, e) => Button_Click(o, e); YesButton = (Button)GetTemplateChild("PART_YesButton"); if (YesButton != null) YesButton.Click += (o, e) => Button_Click(o, e); YesButton1 = (Button)GetTemplateChild("PART_YesButton1"); if (YesButton1 != null) YesButton1.Click += (o, e) => Button_Click(o, e); CancelButton = (Button)GetTemplateChild("PART_CancelButton"); if (CancelButton != null) CancelButton.Click += (o, e) => Button_Click(o, e); CancelButton1 = (Button)GetTemplateChild("PART_CancelButton1"); if (CancelButton1 != null) CancelButton1.Click += (o, e) => Button_Click(o, e); OkButton = (Button)GetTemplateChild("PART_OkButton"); if (OkButton != null) OkButton.Click += (o, e) => Button_Click(o, e); OkButton1 = (Button)GetTemplateChild("PART_OkButton1"); if (OkButton1 != null) OkButton1.Click += (o, e) => Button_Click(o, e); ChangeVisualState(_button.ToString(), true); } #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 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); } /// /// 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(messageText, caption, button, MessageBoxImage.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(messageText, caption, button, icon); } #endregion //Public Static #region Private Static private static MessageBoxResult ShowCore(string messageText, string caption, MessageBoxButton button, MessageBoxImage icon) { MessageBox msgBox = new MessageBox(); msgBox.InitializeMessageBox(messageText, caption, button, icon); msgBox.Show(); return msgBox.MessageBoxResult; } /// /// Resolves the owner Window of the MessageBox. /// /// private static FrameworkElement ResolveOwner() { FrameworkElement owner = null; if (Application.Current != null) { foreach (Window w in Application.Current.Windows) { if (w.IsActive) { owner = w; break; } } } return owner; } #endregion //Private Static #region Protected /// /// Shows the MessageBox /// protected void Show() { Container.ShowDialog(); } /// /// Initializes the MessageBox. /// /// The text. /// The caption. /// The button. /// The image. protected void InitializeMessageBox(string text, string caption, MessageBoxButton button, MessageBoxImage image) { Text = text; Caption = caption; _button = button; 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 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; var owner = ResolveOwner(); if (owner != null) newWindow.Owner = Window.GetWindow(owner); newWindow.ShowInTaskbar = false; newWindow.SizeToContent = System.Windows.SizeToContent.WidthAndHeight; newWindow.ResizeMode = System.Windows.ResizeMode.NoResize; newWindow.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterOwner; 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.Source as Button; switch (button.Name) { case "PART_NoButton": case "PART_NoButton1": MessageBoxResult = MessageBoxResult.No; break; case "PART_YesButton": case "PART_YesButton1": MessageBoxResult = MessageBoxResult.Yes; break; case "PART_CancelButton": case "PART_CancelButton1": MessageBoxResult = MessageBoxResult.Cancel; break; case "PART_OkButton": case "PART_OkButton1": MessageBoxResult = MessageBoxResult.OK; break; } Close(); } /// /// Closes the MessageBox. /// private void Close() { Container.Close(); } #endregion //Event Handlers } }