原理:在失去焦點和獲取焦點的時候,判斷Text值是否爲空或者是否與水印值相同,而後修改TextBox中的Text和Foreground。this
代碼以下:spa
/* ============================================================================== 2 * 類名稱:WatermarkTextBox 3 * 類描述: 4 * 建立人:neoyee 5 * 建立時間:2014/2/25 17:24:11 6 * 修改人: 7 * 修改時間: 8 * 修改備註: 9 * @version 1.0 10 * ==============================================================================*/ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using Windows.UI; namespace WP8.Controls { public sealed class WatermarkTextBox : TextBox { private static readonly DependencyProperty WatermarkTextProperty = DependencyProperty.Register("WatermarkText", typeof(string), typeof(WatermarkTextBox), new PropertyMetadata(string.Empty, new PropertyChangedCallback(WatermarkTextChanged))); private static readonly DependencyProperty WatermarkForegroundProperty = DependencyProperty.Register("WatermarkForeground", typeof(SolidColorBrush), typeof(WatermarkTextBox), new PropertyMetadata(new SolidColorBrush(Colors.Black))); private static readonly DependencyProperty WatermarkBackgroundProperty = DependencyProperty.Register("WatermarkBackground", typeof(SolidColorBrush), typeof(WatermarkTextBox), new PropertyMetadata(new SolidColorBrush(Colors.White))); private static readonly DependencyProperty NormalForegroundProperty = DependencyProperty.Register("NormalForeground", typeof(SolidColorBrush), typeof(WatermarkTextBox), new PropertyMetadata(new SolidColorBrush(Colors.Black), NormalForegroundPropertyChanged)); private static readonly DependencyProperty NormalBackgroundProperty = DependencyProperty.Register("NormalBackground", typeof(SolidColorBrush), typeof(WatermarkTextBox), new PropertyMetadata(new SolidColorBrush(Colors.White))); private static void NormalForegroundPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) { var watermarkTextBox = obj as WatermarkTextBox; if (watermarkTextBox != null) watermarkTextBox.NormalForegroundChanged((SolidColorBrush)args.NewValue); } private void NormalForegroundChanged(SolidColorBrush value) { Foreground = value; } public SolidColorBrush NormalBackground { get { return (SolidColorBrush)GetValue(NormalBackgroundProperty); } set { SetValue(NormalBackgroundProperty, value); } } public SolidColorBrush NormalForeground { get { return (SolidColorBrush)GetValue(NormalForegroundProperty); } set { SetValue(NormalForegroundProperty, value); } } public SolidColorBrush WatermarkBackground { get { return (SolidColorBrush)GetValue(WatermarkBackgroundProperty); } set { SetValue(WatermarkBackgroundProperty, value); } } public SolidColorBrush WatermarkForeground { get { return (SolidColorBrush)GetValue(WatermarkForegroundProperty); } set { SetValue(WatermarkForegroundProperty, value); } } public string WatermarkText { get { return (string)GetValue(WatermarkTextProperty); } set { SetValue(WatermarkTextProperty, value); } } public WatermarkTextBox() { this.LostFocus += WatermarkTextBox_LostFocus; this.GotFocus += WatermarkTextBox_GotFocus; this.TextChanged += WatermarkTextBox_TextChanged; if (string.IsNullOrEmpty(this.Text)) { this.Text = WatermarkText; Foreground = WatermarkForeground; } } void WatermarkTextBox_TextChanged(object sender, TextChangedEventArgs e) { if (Text == WatermarkText) { this.Text = WatermarkText; Foreground = WatermarkForeground; } else if (Text != WatermarkText) { Foreground = NormalForeground; } } private static void WatermarkTextChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) { ((WatermarkTextBox)obj).WatermarkTextChanged(args.OldValue, args.NewValue); } private void WatermarkTextChanged(object OldValue, object NewValue) { } void WatermarkTextBox_GotFocus(object sender, RoutedEventArgs e) { if (this.Text == WatermarkText && Foreground == WatermarkForeground) { this.Text = string.Empty; Foreground = NormalForeground; } } void WatermarkTextBox_LostFocus(object sender, RoutedEventArgs e) { if (string.IsNullOrEmpty(this.Text) || Text == WatermarkText) { this.Text = WatermarkText; Foreground = WatermarkForeground; } } } }