MuchinfoMessageBox.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  1. using Muchinfo.WPF.Controls.Button;
  2. using System;
  3. using System.Windows;
  4. using System.Windows.Controls;
  5. using System.Windows.Input;
  6. using System.Windows.Interop;
  7. using System.Windows.Media;
  8. using System.Windows.Media.Imaging;
  9. using Xceed.Wpf.Toolkit.Primitives;
  10. namespace Muchinfo.WPF.Controls.Windows
  11. {
  12. [TemplatePart(Name = "TitleBorder", Type = typeof(System.Windows.Controls.Border))]
  13. [TemplatePart(Name = "Caption", Type = typeof(TextBlock))]
  14. [TemplatePart(Name = "CloseButton", Type = typeof(ImageButton))]
  15. [TemplatePart(Name = "ImageButton", Type = typeof(Image))]
  16. [TemplatePart(Name = "MessageText", Type = typeof(TextBlock))]
  17. [TemplatePart(Name = "Button1", Type = typeof(System.Windows.Controls.Button))]
  18. [TemplatePart(Name = "Button2", Type = typeof(System.Windows.Controls.Button))]
  19. public class MuchinfoMessageBox : WindowControl
  20. {
  21. static MuchinfoMessageBox()
  22. {
  23. DefaultStyleKeyProperty.OverrideMetadata(typeof(MuchinfoMessageBox),
  24. new FrameworkPropertyMetadata(typeof(MuchinfoMessageBox)));
  25. }
  26. private ImageButton _closeButton;
  27. private System.Windows.Controls.Border _titleBorder;
  28. private TextBlock _captionTextBlock;
  29. private Image _imageButton;
  30. private TextBlock _messageText;
  31. private System.Windows.Controls.Button _button1;
  32. private System.Windows.Controls.Button _button2;
  33. private MessageBoxResult _defaultResult;
  34. private MessageBoxResult _dialogResult;
  35. public MessageBoxResult MessageBoxResult
  36. {
  37. get
  38. {
  39. return this._dialogResult;
  40. }
  41. }
  42. public MuchinfoMessageBox()
  43. {
  44. }
  45. public override void OnApplyTemplate()
  46. {
  47. base.OnApplyTemplate();
  48. _titleBorder = GetTemplateChild("TitleBorder") as System.Windows.Controls.Border;
  49. _captionTextBlock = GetTemplateChild("CaptionTextBlock") as TextBlock;
  50. _closeButton = GetTemplateChild("CloseButton") as ImageButton;
  51. _imageButton = GetTemplateChild("ImageButton") as Image;
  52. _messageText = GetTemplateChild("MessageText") as TextBlock;
  53. _button1 = GetTemplateChild("Button1") as System.Windows.Controls.Button;
  54. _button2 = GetTemplateChild("Button2") as System.Windows.Controls.Button;
  55. if (_closeButton != null)
  56. {
  57. _closeButton.Click += delegate
  58. {
  59. _dialogResult = MessageBoxResult.Cancel;
  60. this.Container.Close();
  61. };
  62. }
  63. if (_titleBorder != null)
  64. {
  65. _titleBorder.MouseMove += delegate(object sender, MouseEventArgs e)
  66. {
  67. if (e.LeftButton == MouseButtonState.Pressed)
  68. {
  69. this.Container.DragMove();
  70. }
  71. };
  72. }
  73. if (_button1 != null)
  74. {
  75. _button1.Click += delegate
  76. {
  77. _dialogResult = (_button == MessageBoxButton.OKCancel || _button == MessageBoxButton.OK) ? MessageBoxResult.OK : MessageBoxResult.Yes;
  78. this.Container.Close();
  79. };
  80. }
  81. if (_button2 != null)
  82. {
  83. _button2.Click += delegate
  84. {
  85. _dialogResult = (_button == MessageBoxButton.OKCancel || _button == MessageBoxButton.OK) ? MessageBoxResult.Cancel : MessageBoxResult.No;
  86. this.Container.Close();
  87. };
  88. }
  89. this.SetDefaultResult();
  90. Initialize();
  91. }
  92. private void SetDefaultResult()
  93. {
  94. System.Windows.Controls.Button defaultButtonFromDefaultResult = this.GetDefaultButtonFromDefaultResult();
  95. if (defaultButtonFromDefaultResult != null)
  96. {
  97. defaultButtonFromDefaultResult.IsDefault = true;
  98. defaultButtonFromDefaultResult.Focus();
  99. }
  100. }
  101. private System.Windows.Controls.Button GetDefaultButtonFromDefaultResult()
  102. {
  103. System.Windows.Controls.Button result = null;
  104. switch (this._defaultResult)
  105. {
  106. case MessageBoxResult.None:
  107. result = _button1; //this.GetDefaultButton();
  108. break;
  109. case MessageBoxResult.OK:
  110. result = _button1; //this.GetMessageBoxButton("PART_OkButton");
  111. break;
  112. case MessageBoxResult.Cancel:
  113. result = _button2; //this.GetMessageBoxButton("PART_CancelButton");
  114. break;
  115. case MessageBoxResult.Yes:
  116. result = _button1; //this.GetMessageBoxButton("PART_YesButton");
  117. break;
  118. case MessageBoxResult.No:
  119. result = _button2; //this.GetMessageBoxButton("PART_NoButton");
  120. break;
  121. }
  122. return result;
  123. }
  124. #region 静态方法
  125. //public static MessageBoxResult Show(string messageText)
  126. //{
  127. // return MuchinfoMessageBox.Show(messageText, string.Empty, MessageBoxButton.OK, null);
  128. //}
  129. //public static MessageBoxResult Show(Window owner, string messageText)
  130. //{
  131. // return MuchinfoMessageBox.Show(owner, messageText, string.Empty, MessageBoxButton.OK, null);
  132. //}
  133. //public static MessageBoxResult Show(string messageText, string caption)
  134. //{
  135. // return MuchinfoMessageBox.Show(messageText, caption, MessageBoxButton.OK, null);
  136. //}
  137. //public static MessageBoxResult Show(Window owner, string messageText, string caption)
  138. //{
  139. // return MuchinfoMessageBox.Show(owner, messageText, caption, null);
  140. //}
  141. //public static MessageBoxResult Show(Window owner, string messageText, string caption, Style messageBoxStyle)
  142. //{
  143. // return MuchinfoMessageBox.Show(owner, messageText, caption, MessageBoxButton.OK, messageBoxStyle);
  144. //}
  145. //public static MessageBoxResult Show(string messageText, string caption, MessageBoxButton button)
  146. //{
  147. // return MuchinfoMessageBox.Show(messageText, caption, button, null);
  148. //}
  149. //public static MessageBoxResult Show(string messageText, string caption, MessageBoxButton button, Style messageBoxStyle)
  150. //{
  151. // return MuchinfoMessageBox.ShowCore(null, messageText, caption, button, MessageBoxImage.None, MessageBoxResult.None, messageBoxStyle);
  152. //}
  153. //public static MessageBoxResult Show(Window owner, string messageText, string caption, MessageBoxButton button)
  154. //{
  155. // return MuchinfoMessageBox.Show(owner, messageText, caption, button, null);
  156. //}
  157. //public static MessageBoxResult Show(Window owner, string messageText, string caption, MessageBoxButton button, Style messageBoxStyle)
  158. //{
  159. // return MuchinfoMessageBox.ShowCore(owner, messageText, caption, button, MessageBoxImage.None, MessageBoxResult.None, messageBoxStyle);
  160. //}
  161. //public static MessageBoxResult Show(string messageText, string caption, MessageBoxButton button, MessageBoxImage icon)
  162. //{
  163. // return MuchinfoMessageBox.Show(messageText, caption, button, icon, null);
  164. //}
  165. //public static MessageBoxResult Show(string messageText, string caption, MessageBoxButton button, MessageBoxImage icon, Style messageBoxStyle)
  166. //{
  167. // return MuchinfoMessageBox.ShowCore(null, messageText, caption, button, icon, MessageBoxResult.None, messageBoxStyle);
  168. //}
  169. public static MessageBoxResult Show(Window owner, string messageText, string caption, MessageBoxButton button, MessageBoxImage icon, Brush background)
  170. {
  171. return MuchinfoMessageBox.ShowCore(owner, messageText, caption, button, icon, MessageBoxResult.None, null, background);
  172. }
  173. //public static MessageBoxResult Show(Window owner, string messageText, string caption, MessageBoxButton button, MessageBoxImage icon, Style messageBoxStyle)
  174. //{
  175. // return MuchinfoMessageBox.ShowCore(owner, messageText, caption, button, icon, MessageBoxResult.None, messageBoxStyle);
  176. //}
  177. //public static MessageBoxResult Show(string messageText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult)
  178. //{
  179. // return MuchinfoMessageBox.Show(messageText, caption, button, icon, defaultResult, null);
  180. //}
  181. //public static MessageBoxResult Show(string messageText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult, Style messageBoxStyle)
  182. //{
  183. // return MuchinfoMessageBox.ShowCore(null, messageText, caption, button, icon, defaultResult, messageBoxStyle);
  184. //}
  185. //public static MessageBoxResult Show(Window owner, string messageText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult)
  186. //{
  187. // return MuchinfoMessageBox.Show(owner, messageText, caption, button, icon, defaultResult, null);
  188. //}
  189. //public static MessageBoxResult Show(Window owner, string messageText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult, Style messageBoxStyle)
  190. //{
  191. // return MuchinfoMessageBox.ShowCore(owner, messageText, caption, button, icon, defaultResult, messageBoxStyle);
  192. //}
  193. private static MessageBoxResult ShowCore(Window owner, string messageText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult, Style messageBoxStyle, Brush background)
  194. {
  195. if (BrowserInteropHelper.IsBrowserHosted)
  196. {
  197. throw new InvalidOperationException("Static methods for MessageBoxes are not available in XBAP. Use the instance ShowMessageBox methods instead.");
  198. }
  199. var messageBox = new MuchinfoMessageBox();
  200. messageBox.InitializeMessageBox(owner, messageText, caption, button, icon, defaultResult);
  201. if (messageBoxStyle != null)
  202. {
  203. messageBox.Style = messageBoxStyle;
  204. }
  205. messageBox.Width = 312;
  206. messageBox.Height = 192;
  207. messageBox.Background = background;
  208. messageBox.ShowDialog();
  209. return messageBox.MessageBoxResult;
  210. //MessageBox messageBox = new MessageBox();
  211. //messageBox.InitializeMessageBox(owner, messageText, caption, button, icon, defaultResult);
  212. //if (messageBoxStyle != null)
  213. //{
  214. // messageBox.Style = messageBoxStyle;
  215. //}
  216. //messageBox.ShowDialog();
  217. //return messageBox.MessageBoxResult;
  218. }
  219. #endregion
  220. public void ShowMessageBox()
  221. {
  222. //if (this.Container != null || base.Parent == null)
  223. //{
  224. // 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.");
  225. //}
  226. //if (!(base.Parent is WindowContainer))
  227. //{
  228. // throw new InvalidOperationException("The MessageBox instance is not intended to be displayed in a container other than a WindowContainer.");
  229. //}
  230. this._dialogResult = MessageBoxResult.None;
  231. base.Visibility = Visibility.Visible;
  232. }
  233. private void ShowMessageBoxCore(string messageText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult)
  234. {
  235. this.InitializeMessageBox(null, messageText, caption, button, icon, defaultResult);
  236. this.ShowMessageBox();
  237. }
  238. public void ShowMessageBox(string messageText)
  239. {
  240. this.ShowMessageBoxCore(messageText, string.Empty, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.None);
  241. }
  242. public void ShowMessageBox(string messageText, string caption)
  243. {
  244. this.ShowMessageBoxCore(messageText, caption, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.None);
  245. }
  246. public void ShowMessageBox(string messageText, string caption, MessageBoxButton button)
  247. {
  248. this.ShowMessageBoxCore(messageText, caption, button, MessageBoxImage.None, MessageBoxResult.None);
  249. }
  250. public void ShowMessageBox(string messageText, string caption, MessageBoxButton button, MessageBoxImage icon)
  251. {
  252. this.ShowMessageBoxCore(messageText, caption, button, icon, MessageBoxResult.None);
  253. }
  254. public void ShowMessageBox(string messageText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult)
  255. {
  256. this.ShowMessageBoxCore(messageText, caption, button, icon, defaultResult);
  257. }
  258. private string _text;
  259. private Window _owner;
  260. private string _caption;
  261. private MessageBoxButton _button;
  262. private MessageBoxImage _image;
  263. protected void InitializeMessageBox(Window owner, string text, string caption, MessageBoxButton button, MessageBoxImage image, MessageBoxResult defaultResult)
  264. {
  265. _owner = owner;
  266. _text = text;
  267. _caption = caption;
  268. _button = button;
  269. _image = image;
  270. _defaultResult = defaultResult;
  271. }
  272. private void Initialize()
  273. {
  274. _messageText.Text = _text;
  275. _captionTextBlock.Text = _caption;
  276. _button1.Visibility = Visibility.Collapsed;
  277. _button2.Visibility = Visibility.Collapsed;
  278. switch (_button)
  279. {
  280. case MessageBoxButton.OK:
  281. _button1.Visibility = Visibility.Collapsed;
  282. _button2.Visibility = Visibility.Visible;
  283. _button2.Content = "确认";
  284. break;
  285. case MessageBoxButton.OKCancel:
  286. case MessageBoxButton.YesNo:
  287. default:
  288. _button1.Visibility = Visibility.Visible;
  289. _button1.Content = "确认";
  290. _button2.Visibility = Visibility.Visible;
  291. _button2.Content = "取消";
  292. break;
  293. }
  294. this.SetImageSource(_image);
  295. }
  296. private void SetImageSource(MessageBoxImage image)
  297. {
  298. string arg = string.Empty;
  299. switch (image)
  300. {
  301. case MessageBoxImage.Question:
  302. arg = "prompt_question.png";
  303. break;
  304. case MessageBoxImage.Warning:
  305. arg = "prompt_warning.png";
  306. break;
  307. case MessageBoxImage.Information:
  308. default:
  309. arg = "prompt_right.png";
  310. break;
  311. }
  312. //var uri = "/Muchinfo.WPF.Controls;component/Images/" + arg;
  313. var uri = "pack://application:,,,/Muchinfo.WPF.Controls;component/Images/" + arg;
  314. var imageSource = new BitmapImage(new Uri(uri, UriKind.RelativeOrAbsolute));
  315. _imageButton.Source = imageSource;
  316. }
  317. public bool? ShowDialog()
  318. {
  319. if (base.Parent != null)
  320. {
  321. throw new InvalidOperationException("This method is not intended to be called while displaying a Message Box inside a WindowContainer. Use 'ShowMessageBox()' instead.");
  322. }
  323. this._dialogResult = MessageBoxResult.None;
  324. base.Visibility = Visibility.Visible;
  325. this.CreateContainer();
  326. return this.Container.ShowDialog();
  327. }
  328. private Window CreateContainer()
  329. {
  330. var window = new Window
  331. {
  332. AllowsTransparency = true,
  333. Background = Brushes.Transparent,
  334. Content = this,
  335. Owner = (this._owner ?? MuchinfoMessageBox.ComputeOwnerWindow()),
  336. ShowInTaskbar = false,
  337. SizeToContent = SizeToContent.WidthAndHeight,
  338. ResizeMode = ResizeMode.NoResize,
  339. WindowStyle = WindowStyle.None
  340. };
  341. window.Title = window.Owner == null ? string.Empty : window.Owner.Title;
  342. window.WindowStartupLocation = window.Owner != null ? WindowStartupLocation.CenterOwner : WindowStartupLocation.CenterScreen;
  343. window.Closed += new EventHandler(this.OnContainerClosed);
  344. return window;
  345. }
  346. protected Window Container
  347. {
  348. get
  349. {
  350. return base.Parent as Window;
  351. }
  352. }
  353. private void OnContainerClosed(object sender, EventArgs e)
  354. {
  355. this.Container.Closed -= new EventHandler(this.OnContainerClosed);
  356. this.Container.Content = null;
  357. this.OnClose();
  358. }
  359. private void OnClose()
  360. {
  361. base.Visibility = Visibility.Collapsed;
  362. this.OnClosed(EventArgs.Empty);
  363. }
  364. protected virtual void OnClosed(EventArgs e)
  365. {
  366. if (this.Closed != null)
  367. {
  368. this.Closed(this, e);
  369. }
  370. }
  371. public event EventHandler Closed;
  372. private static Window ComputeOwnerWindow()
  373. {
  374. Window result = null;
  375. if (Application.Current != null)
  376. {
  377. foreach (Window window in Application.Current.Windows)
  378. {
  379. if (window.IsActive)
  380. {
  381. result = window;
  382. break;
  383. }
  384. }
  385. }
  386. return result;
  387. }
  388. public Style ButtonStyle
  389. {
  390. get { return (Style)GetValue(ButtonStyleProperty); }
  391. set { SetValue(ButtonStyleProperty, value); }
  392. }
  393. // Using a DependencyProperty as the backing store for ButtonStyle. This enables animation, styling, binding, etc...
  394. public static readonly DependencyProperty ButtonStyleProperty =
  395. DependencyProperty.Register("ButtonStyle", typeof(Style), typeof(MuchinfoMessageBox), new PropertyMetadata(null));
  396. }
  397. }