Silverlight Day 3 - WatermarkTextBox 使用者控制項 (UserControl)
而當你發覺你一值在重複地寫類似得程式碼片段時,你可以寫成 (1) Code Snippet (2) 寫成 Code Smith 的程式碼產生器 (3) 抽換成 UserControl。
而本範例,介紹如果將許多的邏輯片段隱藏在 UserControl 之下,讓你或是需要類似效果的程式設計師,可以用得更輕鬆。
先前,在練習 Silverlight 的功能的時候有寫一篇文章【Silverlight 2.0 - 模擬 TextBoxWatermark 控制項】。
那時,並沒有將 TextBoxWatermark 的功能做成控制項。所以,程式設計師必須在需要 Watermark 的效果時,必須不斷寫類似的程式碼。
而當你發覺你一值在重複地寫類似得程式碼片段時,你可以寫成 (1) Code Snippet (2) 寫成 Code Smith 的程式碼產生器 (3) 抽換成 UserControl。
而本範例,介紹如果將許多的邏輯片段隱藏在 UserControl 之下,讓你或是需要類似效果的程式設計師,可以用得更輕鬆。
(1) 一樣地,我們要先在 Silverlight 專案中,新增一個 Silverlight User Control 的 Project。
(2) 然後思考一個 WatermarkTextBox 需要哪些欄位(Field)、屬姓(Propety)、事件(Event)、方法(Method)
(3) 配置如下:
- TextBox 控制項
- EmptyString 欄位,代表浮水印文字
- 需要處理 GotFocus、LostFocus、TextChanged 事件
- 需要有 浮水印樣式、一般文字輸入樣式
(4) 撰寫程式碼完成我們所需要的效果:
1: using System.Windows;
2: using System.Windows.Controls;
3: using System.Windows.Media;
		   4:   
		5: namespace WatermarkTextBoxDemo
		   6:  {
		7: public partial class WatermarkTextBox : UserControl
		   8:      {
		9: public WatermarkTextBox()
		  10:          {
		
		  11:              InitializeComponent();
		
		  12:              Text = _EmptyString;
		
		  13:          }
		
		  14:   
		15: /// <summary>
16: /// 預設浮水印文字
17: /// </summary>
18: private string _EmptyString = "請輸入文字";
		  19:   
		20: /// <summary>
21: /// 浮水印文字
22: /// </summary>
23: public string EmptyString
		  24:          {
		25: get { return _EmptyString; }
		  26:              set
		
		  27:              {
		28: Text = value;
29: _EmptyString = value;
		  30:              }
		
		  31:          }
		
		  32:   
		33: /// <summary>
34: /// 輸入框文字
35: /// </summary>
36: public string Text
		  37:          {
		
		  38:              get
		
		  39:              {
		40: // "空白" 或是 "浮水印文字" 回傳空白
41: return (string.IsNullOrEmpty(txtInput.Text) || txtInput.Text == EmptyString)
42: ? string.Empty
		  43:                             : txtInput.Text.Trim();
		
		  44:              }
		45: set { txtInput.Text = value; }
		  46:          }
		
		  47:   
		48: /// <summary>
49: /// 得到焦點時,若為 "空白" 或是 "浮水印文字" 將內容清除
50: /// </summary>
51: /// <param name="sender"></param>
52: /// <param name="e"></param>
53: private void txtInput_GotFocus(object sender, RoutedEventArgs e)
		  54:          {
		55: if (string.IsNullOrEmpty(Text) || Text == EmptyString)
		  56:              {
		57: Text = string.Empty;
		  58:              }
		
		  59:          }
		
		  60:   
		61: /// <summary>
62: /// 失去焦點時,若為 "空白" 或是 "浮水印文字" 將設定回浮水印文字
63: /// </summary>
64: /// <param name="sender"></param>
65: /// <param name="e"></param>
66: private void TextBox_LostFocus(object sender, RoutedEventArgs e)
		  67:          {
		68: if (string.IsNullOrEmpty(Text) || Text == EmptyString)
		  69:              {
		
		  70:                  Text = EmptyString;
		
		  71:              }
		
		  72:          }
		
		  73:   
		74: /// <summary>
75: /// 輸入內容改變時,改變樣式
76: /// </summary>
77: /// <param name="sender"></param>
78: /// <param name="e"></param>
79: private void txtInput_TextChanged(object sender, TextChangedEventArgs e)
		  80:          {
		81: if (string.IsNullOrEmpty(Text) || Text == EmptyString)
		  82:              {
		83: // 浮水印樣式
84: txtInput.Foreground = new SolidColorBrush(Color.FromArgb(255, 204, 204, 204));
85: txtInput.Background = new SolidColorBrush(Color.FromArgb(255, 240, 248, 255));
		  86:              }
		87: else
		  88:              {
		89: // 一般輸入框樣式
90: txtInput.Foreground = new SolidColorBrush(Color.FromArgb(255, 0, 0, 255));
91: txtInput.Background = new SolidColorBrush(Color.FromArgb(255, 255, 255, 255));
		  92:              }
		
		  93:          }
		
		  94:      }
		
		  95:  }
	
(5) 做成 UserControl 以後,我們把 WatermarkTextBox 加入 XAML 中,只要輕鬆設定 EmptyString 就有浮水印效果囉,例如:
(6) 而且做成 UserControl 在 Belnd2 也可以看到 EmptyString 屬性唷
(7) 如果有興趣可以玩玩看 WatermarkTextBox DEMO 網頁,或參考以下執行畫面:



