using Muchinfo.WPF.Controls.Button; using System; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Interop; using System.Windows.Media; using System.Windows.Media.Imaging; using Xceed.Wpf.Toolkit.Primitives; namespace Muchinfo.WPF.Controls.Windows { [TemplatePart(Name = "TitleBorder", Type = typeof(System.Windows.Controls.Border))] [TemplatePart(Name = "Caption", Type = typeof(TextBlock))] [TemplatePart(Name = "CloseButton", Type = typeof(ImageButton))] [TemplatePart(Name = "ImageButton", Type = typeof(Image))] [TemplatePart(Name = "MessageText", Type = typeof(TextBlock))] [TemplatePart(Name = "Button1", Type = typeof(System.Windows.Controls.Button))] [TemplatePart(Name = "Button2", Type = typeof(System.Windows.Controls.Button))] public class MuchinfoMessageBox : WindowControl { static MuchinfoMessageBox() { DefaultStyleKeyProperty.OverrideMetadata(typeof(MuchinfoMessageBox), new FrameworkPropertyMetadata(typeof(MuchinfoMessageBox))); } private ImageButton _closeButton; private System.Windows.Controls.Border _titleBorder; private TextBlock _captionTextBlock; private Image _imageButton; private TextBlock _messageText; private System.Windows.Controls.Button _button1; private System.Windows.Controls.Button _button2; private MessageBoxResult _defaultResult; private MessageBoxResult _dialogResult; public MessageBoxResult MessageBoxResult { get { return this._dialogResult; } } public MuchinfoMessageBox() { } public override void OnApplyTemplate() { base.OnApplyTemplate(); _titleBorder = GetTemplateChild("TitleBorder") as System.Windows.Controls.Border; _captionTextBlock = GetTemplateChild("CaptionTextBlock") as TextBlock; _closeButton = GetTemplateChild("CloseButton") as ImageButton; _imageButton = GetTemplateChild("ImageButton") as Image; _messageText = GetTemplateChild("MessageText") as TextBlock; _button1 = GetTemplateChild("Button1") as System.Windows.Controls.Button; _button2 = GetTemplateChild("Button2") as System.Windows.Controls.Button; if (_closeButton != null) { _closeButton.Click += delegate { _dialogResult = MessageBoxResult.Cancel; this.Container.Close(); }; } if (_titleBorder != null) { _titleBorder.MouseMove += delegate(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { this.Container.DragMove(); } }; } if (_button1 != null) { _button1.Click += delegate { _dialogResult = (_button == MessageBoxButton.OKCancel || _button == MessageBoxButton.OK) ? MessageBoxResult.OK : MessageBoxResult.Yes; this.Container.Close(); }; } if (_button2 != null) { _button2.Click += delegate { _dialogResult = (_button == MessageBoxButton.OKCancel || _button == MessageBoxButton.OK) ? MessageBoxResult.Cancel : MessageBoxResult.No; this.Container.Close(); }; } this.SetDefaultResult(); Initialize(); } private void SetDefaultResult() { System.Windows.Controls.Button defaultButtonFromDefaultResult = this.GetDefaultButtonFromDefaultResult(); if (defaultButtonFromDefaultResult != null) { defaultButtonFromDefaultResult.IsDefault = true; defaultButtonFromDefaultResult.Focus(); } } private System.Windows.Controls.Button GetDefaultButtonFromDefaultResult() { System.Windows.Controls.Button result = null; switch (this._defaultResult) { case MessageBoxResult.None: result = _button1; //this.GetDefaultButton(); break; case MessageBoxResult.OK: result = _button1; //this.GetMessageBoxButton("PART_OkButton"); break; case MessageBoxResult.Cancel: result = _button2; //this.GetMessageBoxButton("PART_CancelButton"); break; case MessageBoxResult.Yes: result = _button1; //this.GetMessageBoxButton("PART_YesButton"); break; case MessageBoxResult.No: result = _button2; //this.GetMessageBoxButton("PART_NoButton"); break; } return result; } #region 静态方法 //public static MessageBoxResult Show(string messageText) //{ // return MuchinfoMessageBox.Show(messageText, string.Empty, MessageBoxButton.OK, null); //} //public static MessageBoxResult Show(Window owner, string messageText) //{ // return MuchinfoMessageBox.Show(owner, messageText, string.Empty, MessageBoxButton.OK, null); //} //public static MessageBoxResult Show(string messageText, string caption) //{ // return MuchinfoMessageBox.Show(messageText, caption, MessageBoxButton.OK, null); //} //public static MessageBoxResult Show(Window owner, string messageText, string caption) //{ // return MuchinfoMessageBox.Show(owner, messageText, caption, null); //} //public static MessageBoxResult Show(Window owner, string messageText, string caption, Style messageBoxStyle) //{ // return MuchinfoMessageBox.Show(owner, messageText, caption, MessageBoxButton.OK, messageBoxStyle); //} //public static MessageBoxResult Show(string messageText, string caption, MessageBoxButton button) //{ // return MuchinfoMessageBox.Show(messageText, caption, button, null); //} //public static MessageBoxResult Show(string messageText, string caption, MessageBoxButton button, Style messageBoxStyle) //{ // return MuchinfoMessageBox.ShowCore(null, messageText, caption, button, MessageBoxImage.None, MessageBoxResult.None, messageBoxStyle); //} //public static MessageBoxResult Show(Window owner, string messageText, string caption, MessageBoxButton button) //{ // return MuchinfoMessageBox.Show(owner, messageText, caption, button, null); //} //public static MessageBoxResult Show(Window owner, string messageText, string caption, MessageBoxButton button, Style messageBoxStyle) //{ // return MuchinfoMessageBox.ShowCore(owner, messageText, caption, button, MessageBoxImage.None, MessageBoxResult.None, messageBoxStyle); //} //public static MessageBoxResult Show(string messageText, string caption, MessageBoxButton button, MessageBoxImage icon) //{ // return MuchinfoMessageBox.Show(messageText, caption, button, icon, null); //} //public static MessageBoxResult Show(string messageText, string caption, MessageBoxButton button, MessageBoxImage icon, Style messageBoxStyle) //{ // return MuchinfoMessageBox.ShowCore(null, messageText, caption, button, icon, MessageBoxResult.None, messageBoxStyle); //} public static MessageBoxResult Show(Window owner, string messageText, string caption, MessageBoxButton button, MessageBoxImage icon, Brush background) { return MuchinfoMessageBox.ShowCore(owner, messageText, caption, button, icon, MessageBoxResult.None, null, background); } //public static MessageBoxResult Show(Window owner, string messageText, string caption, MessageBoxButton button, MessageBoxImage icon, Style messageBoxStyle) //{ // return MuchinfoMessageBox.ShowCore(owner, messageText, caption, button, icon, MessageBoxResult.None, messageBoxStyle); //} //public static MessageBoxResult Show(string messageText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult) //{ // return MuchinfoMessageBox.Show(messageText, caption, button, icon, defaultResult, null); //} //public static MessageBoxResult Show(string messageText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult, Style messageBoxStyle) //{ // return MuchinfoMessageBox.ShowCore(null, messageText, caption, button, icon, defaultResult, messageBoxStyle); //} //public static MessageBoxResult Show(Window owner, string messageText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult) //{ // return MuchinfoMessageBox.Show(owner, messageText, caption, button, icon, defaultResult, null); //} //public static MessageBoxResult Show(Window owner, string messageText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult, Style messageBoxStyle) //{ // return MuchinfoMessageBox.ShowCore(owner, messageText, caption, button, icon, defaultResult, messageBoxStyle); //} private static MessageBoxResult ShowCore(Window owner, string messageText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult, Style messageBoxStyle, Brush background) { if (BrowserInteropHelper.IsBrowserHosted) { throw new InvalidOperationException("Static methods for MessageBoxes are not available in XBAP. Use the instance ShowMessageBox methods instead."); } var messageBox = new MuchinfoMessageBox(); messageBox.InitializeMessageBox(owner, messageText, caption, button, icon, defaultResult); if (messageBoxStyle != null) { messageBox.Style = messageBoxStyle; } messageBox.Width = 312; messageBox.Height = 192; messageBox.Background = background; messageBox.ShowDialog(); return messageBox.MessageBoxResult; //MessageBox messageBox = new MessageBox(); //messageBox.InitializeMessageBox(owner, messageText, caption, button, icon, defaultResult); //if (messageBoxStyle != null) //{ // messageBox.Style = messageBoxStyle; //} //messageBox.ShowDialog(); //return messageBox.MessageBoxResult; } #endregion public void ShowMessageBox() { //if (this.Container != null || base.Parent == null) //{ // throw new InvalidOperationException("This method is not intended to be called while displaying a MessageBox outside of a WindowContainer. Use ShowDialog() instead in that case."); //} //if (!(base.Parent is WindowContainer)) //{ // throw new InvalidOperationException("The MessageBox instance is not intended to be displayed in a container other than a WindowContainer."); //} this._dialogResult = MessageBoxResult.None; base.Visibility = Visibility.Visible; } private void ShowMessageBoxCore(string messageText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult) { this.InitializeMessageBox(null, messageText, caption, button, icon, defaultResult); this.ShowMessageBox(); } public void ShowMessageBox(string messageText) { this.ShowMessageBoxCore(messageText, string.Empty, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.None); } public void ShowMessageBox(string messageText, string caption) { this.ShowMessageBoxCore(messageText, caption, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.None); } public void ShowMessageBox(string messageText, string caption, MessageBoxButton button) { this.ShowMessageBoxCore(messageText, caption, button, MessageBoxImage.None, MessageBoxResult.None); } public void ShowMessageBox(string messageText, string caption, MessageBoxButton button, MessageBoxImage icon) { this.ShowMessageBoxCore(messageText, caption, button, icon, MessageBoxResult.None); } public void ShowMessageBox(string messageText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult) { this.ShowMessageBoxCore(messageText, caption, button, icon, defaultResult); } private string _text; private Window _owner; private string _caption; private MessageBoxButton _button; private MessageBoxImage _image; protected void InitializeMessageBox(Window owner, string text, string caption, MessageBoxButton button, MessageBoxImage image, MessageBoxResult defaultResult) { _owner = owner; _text = text; _caption = caption; _button = button; _image = image; _defaultResult = defaultResult; } private void Initialize() { _messageText.Text = _text; _captionTextBlock.Text = _caption; _button1.Visibility = Visibility.Collapsed; _button2.Visibility = Visibility.Collapsed; switch (_button) { case MessageBoxButton.OK: _button1.Visibility = Visibility.Collapsed; _button2.Visibility = Visibility.Visible; _button2.Content = "确认"; break; case MessageBoxButton.OKCancel: case MessageBoxButton.YesNo: default: _button1.Visibility = Visibility.Visible; _button1.Content = "确认"; _button2.Visibility = Visibility.Visible; _button2.Content = "取消"; break; } this.SetImageSource(_image); } private void SetImageSource(MessageBoxImage image) { string arg = string.Empty; switch (image) { case MessageBoxImage.Question: arg = "prompt_question.png"; break; case MessageBoxImage.Warning: arg = "prompt_warning.png"; break; case MessageBoxImage.Information: default: arg = "prompt_right.png"; break; } //var uri = "/Muchinfo.WPF.Controls;component/Images/" + arg; var uri = "pack://application:,,,/Muchinfo.WPF.Controls;component/Images/" + arg; var imageSource = new BitmapImage(new Uri(uri, UriKind.RelativeOrAbsolute)); _imageButton.Source = imageSource; } public bool? ShowDialog() { if (base.Parent != null) { throw new InvalidOperationException("This method is not intended to be called while displaying a Message Box inside a WindowContainer. Use 'ShowMessageBox()' instead."); } this._dialogResult = MessageBoxResult.None; base.Visibility = Visibility.Visible; this.CreateContainer(); return this.Container.ShowDialog(); } private Window CreateContainer() { var window = new Window { AllowsTransparency = true, Background = Brushes.Transparent, Content = this, Owner = (this._owner ?? MuchinfoMessageBox.ComputeOwnerWindow()), ShowInTaskbar = false, SizeToContent = SizeToContent.WidthAndHeight, ResizeMode = ResizeMode.NoResize, WindowStyle = WindowStyle.None }; window.Title = window.Owner == null ? string.Empty : window.Owner.Title; window.WindowStartupLocation = window.Owner != null ? WindowStartupLocation.CenterOwner : WindowStartupLocation.CenterScreen; window.Closed += new EventHandler(this.OnContainerClosed); return window; } protected Window Container { get { return base.Parent as Window; } } private void OnContainerClosed(object sender, EventArgs e) { this.Container.Closed -= new EventHandler(this.OnContainerClosed); this.Container.Content = null; this.OnClose(); } private void OnClose() { base.Visibility = Visibility.Collapsed; this.OnClosed(EventArgs.Empty); } protected virtual void OnClosed(EventArgs e) { if (this.Closed != null) { this.Closed(this, e); } } public event EventHandler Closed; private static Window ComputeOwnerWindow() { Window result = null; if (Application.Current != null) { foreach (Window window in Application.Current.Windows) { if (window.IsActive) { result = window; break; } } } return result; } public Style ButtonStyle { get { return (Style)GetValue(ButtonStyleProperty); } set { SetValue(ButtonStyleProperty, value); } } // Using a DependencyProperty as the backing store for ButtonStyle. This enables animation, styling, binding, etc... public static readonly DependencyProperty ButtonStyleProperty = DependencyProperty.Register("ButtonStyle", typeof(Style), typeof(MuchinfoMessageBox), new PropertyMetadata(null)); } }