本文共 1650 字,大约阅读时间需要 5 分钟。
在Silverlight2里面,提供了TextBox的水印WaterMark功能。但是之后的版本就把这个功能给删了。关于Silverlight2里面的水印功能可以参考这篇文章《》。之后想用水印唯有自己写一个了。
以下是我自己写的一个带水印的TextBox。
除了增加一个属性之外,还需要增加一些保存区别于正常状态的属性的全局变量。
//水印状态private Brush _redColor = new SolidColorBrush(Colors.Red);private double _halfOpacity = 0.5;//正常状态private Brush _userColor;private double _userOpacity;public string WaterMarkText { get; set; }
在TextBox里面我们可以发现这两个事件是Override标记的,所以可以重载他们。
protected override void OnGotFocus(RoutedEventArgs e){ if (this.Text == WaterMarkText) { this.Text = ""; this.Foreground = _userColor; this.Opacity = _userOpacity; } base.OnGotFocus(e);}protected override void OnLostFocus(RoutedEventArgs e){ if (this.Text.Length < 1) { this.Text = WaterMarkText; this.Foreground = _redColor; this.Opacity = _halfOpacity; } base.OnLostFocus(e);}
类似于初始化,先验检测水印是否存在,而且设置水印。这个我将代码写在SizeChanged事件里面。为什么要写在这里可以参考另外一篇文章,关于控件的生命周期的《》。另外要将_userColor和_userOpacity初始化。
SizeChanged事件的代码如下:
public MyTextBox(){ SizeChanged += new SizeChangedEventHandler(MyTextBox_SizeChanged);}void MyTextBox_SizeChanged(object sender, SizeChangedEventArgs e){ _userColor = this.Foreground; _userOpacity = this.Opacity; if (WaterMarkText != "") { this.Foreground = _redColor; this.Opacity = _halfOpacity; this.Text = WaterMarkText; }}
local是命名空间,是MyTextBox类所在的命名空间。本机是这样写的:xmlns:local="clr-namespace:TextBoxWaterMark"
未获取焦点:
获取焦点并输入
好记性不如烂笔头
转载地址:http://pildx.baihongyu.com/