silverlight已經自帶messageBox控件,並且非常方便地使用,其特性是模態提示窗,需要確定關閉后才能繼續其他操作,不然當前ui線程就一直處於等待狀態。
但是為什么還要開發一個自定義的messageBox呢?
當我們發現silverlight自帶的彈出確認框與整個系統的風格非常格格不入的時候,華麗的界面彈出一個灰色的提示框,整體感覺就不言而喻了。
想去嘗試修改它的樣式,可悲的是它是跟操作系統關聯的,並不獨立於silverlight,我們根本就無法自定義它的樣式。
所以接下來我們模擬它實現一個符合自己系統風格的彈出確認提示框。分析其特性,我們發現silverlight的ChildWindow用戶控件非常類似彈出提示框,所以我們就繼承ChildWindow控件,作進一步修改。
1、創建SelfMessageBox用戶控件,直接修改它繼承ChildWindow類。
2、新增Button按鈕的樣式,為確定和取消按鈕所用。
將背景顏色改為深藍色,給Button按鈕創建一個空的模板為btnBlueTemplate


3、編輯ChildWindow的樣式。

設置LayoutRoot Grid為兩行,並添加提示內容TextBlock和確定、取消按鈕
SelfMessageBox代碼
1 public partial class SelfMessageBox : ChildWindow 2 { 3 /// <summary> 4 /// 提示信息 5 /// </summary> 6 public string MessageText 7 { 8 get 9 { 10 return this.Tag.ToString(); 11 } 12 set 13 { 14 this.Tag = value; 15 } 16 } 17 18 /// <summary> 19 /// 是否有取消按鈕 20 /// </summary> 21 public bool IsHavCancelButton 22 { 23 get 24 { 25 return (bool)GetValue(IsHavCancelButtonProperty); 26 } 27 set 28 { 29 SetValue(IsHavCancelButtonProperty, value); 30 } 31 } 32 33 private readonly static DependencyProperty IsHavCancelButtonProperty = DependencyProperty.Register("IsHavCancelButton", typeof(bool), typeof(SelfMessageBox), new PropertyMetadata(false, OnIsHavCancelButtonChanged)); 34 35 private static void OnIsHavCancelButtonChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 36 { 37 SelfMessageBox selfMessageBox = sender as SelfMessageBox; 38 if ((bool)e.NewValue == true) 39 { 40 selfMessageBox.CancelButton.Visibility = Visibility.Visible; 41 } 42 else 43 { 44 selfMessageBox.CancelButton.Visibility = Visibility.Collapsed; 45 } 46 } 47 48 #region 方法重寫 49 protected override void OnClosed(System.EventArgs e) 50 { 51 base.OnClosed(e); 52 Application.Current.RootVisual.SetValue(Control.IsEnabledProperty, true); 53 } 54 55 protected override void OnOpened() 56 { 57 base.OnOpened(); 58 Application.Current.RootVisual.SetValue(Control.IsEnabledProperty, false); 59 } 60 #endregion 61 62 public SelfMessageBox() 63 { 64 InitializeComponent(); 65 } 66 67 private void OKButton_Click(object sender, RoutedEventArgs e) 68 { 69 this.DialogResult = true; 70 } 71 72 private void CancelButton_Click(object sender, RoutedEventArgs e) 73 { 74 this.DialogResult = false; 75 } 76 }
重寫OnOpened和OnClosed兩個方法。
原因是因為silverlight彈出ChildWindow窗口關閉時,偶爾會出現整個 silverlight應用系統被蒙版遮擋了,不能作其他操作,只能重新打開系統,Google一下這是silverlight的bug,這么嚴重的bug真是太惡心了。(也許你並未遇到這種情況,但它確實存在)
4、創建MessageBoxHelper類,提供彈出窗口的靜態方法。
MessageBoxHelper代碼
1 public class MessageBoxHelper 2 { 3 public static void ShowDialog(string caption, string messageText, MessageDialogButton dialogButton = MessageDialogButton.Ok, Action<object, MessageEventArgs> ClosedAction = null) 4 { 5 SelfMessageBox selfMessageBox = new SelfMessageBox() { Width = 320, Height = 180, IsHavCancelButton = (dialogButton == MessageDialogButton.OkAndCancel ? true : false), Title = caption, MessageText = messageText }; 6 selfMessageBox.Closed += (sender, e) => 7 { 8 if (ClosedAction != null) 9 { 10 MessageEventArgs mesArg = new MessageEventArgs(); 11 ChildWindow cw = sender as ChildWindow; 12 if (cw != null) 13 { 14 if (cw.DialogResult == true) 15 { 16 mesArg.DialogResult = MessageDialogResult.OK; 17 } 18 else 19 { 20 mesArg.DialogResult = MessageDialogResult.Cancel; 21 } 22 } 23 ClosedAction(sender, mesArg); 24 } 25 }; 26 selfMessageBox.Show(); 27 } 28 } 29 30 public enum MessageDialogButton 31 { 32 Ok, 33 OkAndCancel 34 } 35 36 public enum MessageDialogResult 37 { 38 OK, 39 Cancel 40 } 41 42 public class MessageEventArgs : EventArgs 43 { 44 public MessageDialogResult DialogResult { get; set; } 45 }
5、演示示例
如需源代碼,請猛點擊下載
