silverlight-带水印的TextBox

简介:

在Silverlight2里面,提供了TextBox的水印WaterMark功能。但是之后的版本就把这个功能给删了。关于Silverlight2里面的水印功能可以参考这篇文章《一步一步学Silverlight 2系列(2):基本控件》。之后想用水印唯有自己写一个了。

以下是我自己写的一个带水印的TextBox。

1.新建类MyTextBox,继承TextBox。

2.在MyTextBox类里面,增加一个属性WaterMarkText用来保存水印。

除了增加一个属性之外,还需要增加一些保存区别于正常状态的属性的全局变量。

//水印状态
private Brush _redColor = new SolidColorBrush(Colors.Red);
private double _halfOpacity = 0.5;

//正常状态
private Brush _userColor;
private double _userOpacity;

public string WaterMarkText { get; set; }

3.并且重写OnGotFocus()和OnLostFocus()两个事件。

在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);
}

4.虽然这里已经完成大部分工作了,但是还有一个重要的地方。

类似于初始化,先验检测水印是否存在,而且设置水印。这个我将代码写在SizeChanged事件里面。为什么要写在这里可以参考另外一篇文章,关于控件的生命周期的《Silverlight 的控件生命周期 - 木野狐(Neil Chen)》。另外要将_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;
    }
}

 5.源代码,至此工作完成。以下是完整代码:

带水印的TextBox

 

6.调用过程
<local:MyTextBox Foreground="Blue" WaterMarkText="请输入!" />

local是命名空间,是MyTextBox类所在的命名空间。本机是这样写的:xmlns:local="clr-namespace:TextBoxWaterMark"

 

效果图如下:

未获取焦点:

获取焦点并输入

 

好记性不如烂笔头

 

相关文章
|
数据可视化 数据处理 C#
WPF技术之TextBox控件
WPF ProgressBar控件用于显示操作的进度。它提供了一个可视化的进度条,用于表示任务的完成程度
125 0
WPF中给TextBox/TextBlock设置提示文本
WPF中给TextBox/TextBlock设置提示文本
WPF中给TextBox/TextBlock设置提示文本
|
C#
WPF TextBox自动滚动到最户一行
原文:WPF TextBox自动滚动到最户一行 textBox经常用来显示程序的运行状态或者消息,如何让他自动滚动呢? 在显示消息代码下加一条自动滚动到底部的语句即可:  TextBox1.ScrollToEnd(); (如果要显示垂直滚动条设置VerticalScrollBarVisibility="Auto",如果不显示设置为Hidden) 我用的程序代码如下:   this.
2118 0
|
C# 数据安全/隐私保护
WPF实现TextBox水印效果
原文:WPF实现TextBox水印效果 在日常项目中,一个TextBox需要输入用户名,我们通常的做法是先用一个TextBlock来说明,例如下面的截图: 今天将使用另外一种方式来展示,使用水印的方式。
1722 0
|
Web App开发 C#
WPF 实现带标题的TextBox
原文:WPF 实现带标题的TextBox 这篇博客将分享在WPF中如何创建一个带Title的TextBox。首先请看一下最终的效果, 实现思路:使用TextBlock+TextBox来实现,TextBlock用来显示Title。
1237 0
|
C# 容器 数据可视化
WPF自定义TextBox及ScrollViewer
原文:WPF自定义TextBox及ScrollViewer   寒假过完,在家真心什么都做不了,可能年龄大了,再想以前那样能专心坐下来已经不行了。回来第一件事就是改了项目的一个bug,最近又新增了一个新的功能,为程序添加了一个消息栏。
1686 0
|
C#
【C#/WPF】TextBlock/TextBox/Label编辑文字的问题
原文:【C#/WPF】TextBlock/TextBox/Label编辑文字的问题 标题有点描述不清,就当是为了方便自己用时易于搜索到。
1408 0
|
C#
WPF中TextBox文件拖放问题
原文:WPF中TextBox文件拖放问题 在WPF中,当我们尝试向TextBox中拖放文件,从而获取其路径时,往往无法成功(拖放文字可以成功)。造成这种原因关键是WPF的TextBox对拖放事件处理机制的不同,具体可参考这篇文章Textbox Drag/Drop in WPF,本文只是介绍如何解决这一问题。
903 0
UWP TextBox私人定制
原文:UWP TextBox私人定制 这次私人定制的是背景透明的TextBox,普通的TextBox在获取焦点后,背景色就变白色了。 下面的代码可以让TextBox的背景始终是透明的。   其实很简单,就修改了 改为 下面的 ...
1036 0