原理:在失去焦点和获取焦点的时候,判断Text值是否为空或者是否与水印值相同,然后修改TextBox中的Text和Foreground。
代码如下:
/* ============================================================================== 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; } } } }