WinForms中的水印文本框

有谁能告诉我一个很好的基本Windows窗体文本框实现,它最初会显示水印文本,当光标进入时,水印文本会消失?我想我可以创造性地使用Enter和Leave事件来创建自己的,但我确信在某个地方有一个完全可用的实现。我看到了WPF的实现,如果有必要,我可以嵌套它,但是本机WinForms TextBox的派生版本会更好

到目前为止,我已经做到了这一点;还没有尝试过,但有人看到任何明显的问题吗

公共类水印文本框:文本框
{
公共字符串水印文本{get;set;}
公共颜色水印颜色{get;set;}
专用颜色TextColor{get;set;}
私有产权转让;
公共水印文本框()
{
WatermarkColor=SystemColors.GrayText;
}
private bool HasText{get{return Text.IsNotNullOrBlankOr(WatermarkText);}
受保护的覆盖void OnEnter(事件参数e)
{
基元数(e);
如果(HasText)返回;
isInTransition=true;
前颜色=文本颜色;
Text=String.Empty;
isInTransition=false;
}
受保护的覆盖无效OnForeColorChanged(事件参数e)
{
基础。前颜色变化(e);
if(!isInTransition)//更改来自外部
TextColor=前景色;
}
受保护的覆盖void OnLeave(事件参数e)
{
底面无檐(e);
如果(HasText)返回;
isInTransition=true;
前景色=水印颜色;
Text=水印Text.EmptyIfNull();
isInTransition=false;
}
}

编辑:上述方法最终会有一些改进,但提示提供者的效果要好得多。以下是我的最终实现:

公共类水印文本框:文本框
{
私有字符串水印文本;
公共字符串水印文本
{
获取{返回水印文本;}
设置
{
水印文本=值;
if(watermarkText.IsNullOrBlank())
CueProvider.ClearCue(这个);
其他的
SetCue(这是水印文本);
}
}
}

我本可以完全集成CueProvider功能,但这非常有效

官方术语是“球杆横幅”。这里有另一种方法,只需继承TextBox也可以完成任务。向项目中添加一个新类并粘贴如下所示的代码。编写从工具箱顶部拖放新控件并设置Cue属性

您将在设计器中获得提示值的实时预览,并将其本地化为窗体的Language属性。花很少的钱就能得到很多的成功,这是Winforms优秀部分的一个极好的演示

使用系统;
使用系统组件模型;
使用System.Windows.Forms;
使用System.Runtime.InteropServices;
类CueTextBox:TextBox{
[可本地化(正确)]
公共字符串提示{
获取{return mCue;}
设置{mCue=value;updateue();}
}
私有void updatece(){
if(this.IsHandleCreated&mCue!=null){
SendMessage(this.Handle,0x1501,(IntPtr)1,mCue);
}
}
已创建受保护的重写无效OnHandleCreated(EventArgs e){
碱基。根据HandleCreated(e);
更新();
}
私有字符串mCue;
//平沃克
[DllImport(“user32.dll”,CharSet=CharSet.Unicode)]
私有静态外部IntPtr SendMessage(IntPtr hWnd、int msg、IntPtr wp、字符串lp);
}

发表评论