silverlight已經自帶messageBox控制項,並且非常方便地使用,其特性是模態提示窗,需要確定關閉後才能繼續其他操作,不然當前ui執行緒就一直處於等候狀態。
但是為什麼還要開發一個自訂的messageBox呢?
當我們發現silverlight自帶的彈出確認框與整個系統的風格非常格格不入的時候,華麗的介面彈出一個灰色的提示框,整體感覺就不言而喻了。

Unknown  

想去嘗試修改它的樣式,可悲的是它是跟作業系統關聯的,並不獨立于silverlight,我們根本就無法自訂它的樣式。
所以接下來我們類比它實現一個符合自己系統風格的彈出確認提示框。分析其特性,我們發現silverlight的ChildWindow使用者控制項非常類似彈出提示框,所以我們就繼承ChildWindow控制項,作進一步修改。
1、創建SelfMessageBox使用者控制項,直接修改它繼承ChildWindow類。

Unknown  

2、新增Button按鈕的樣式,為確定和取消按鈕所用。
將背景顏色改為深藍色,給Button按鈕創建一個空的範本為btnBlueTemplate

13505LZ3-0  
13505GK3-1  

3、編輯ChildWindow的樣式。

Unknown  
13505JC4-2  

設置LayoutRoot Grid為兩行,並添加提示內容TextBlock和確定、取消按鈕

Unknown  

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 }
創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()