| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439 |
- 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));
- }
- }
|