WPF TextBox和PasswordBox添加水印
程序员文章站
2022-03-10 14:28:37
本文实例为大家分享textbox和passwordbox加水印的方法,供大家参考,具体内容如下
textbox加水印
textbox加水印,需要一个visualbrus...
本文实例为大家分享textbox和passwordbox加水印的方法,供大家参考,具体内容如下
textbox加水印
textbox加水印,需要一个visualbrush和触发器验证text是否为空,在空的时候设置背景的brush就可以实现水印效果。
<textbox name="txtboxname" width="120" height="23"> <textbox.resources> <visualbrush x:key="helpbrush" tilemode="none" opacity="0.3" stretch="none" alignmentx="left"> <visualbrush.visual> <textblock fontstyle="italic" text="水印效果"/> </visualbrush.visual> </visualbrush> </textbox.resources> <textbox.style> <style targettype="textbox"> <setter property="height" value="23"/> <setter property="horizontalalignment" value="left"/> <setter property="verticalalignment" value="top"/> <style.triggers> <trigger property="text" value="{x:null}"> <setter property="background" value="{staticresource helpbrush}"/> </trigger> <trigger property="text" value=""> <setter property="background" value="{staticresource helpbrush}"/> </trigger> </style.triggers> </style> </textbox.style> </textbox>
passwordbox加水印
passwordbox加水印,需要添加判断输入非空的依赖属性,因为passwordbox本身没有这个属性。
通过一个passwordlength函数判断密码框的长度是不是0,如果是0则显示背景水印,否则就隐藏。
属性部分代码,cs文件
public class passwordboxmonitor : dependencyobject { public static bool getismonitoring(dependencyobject obj) { return (bool)obj.getvalue(ismonitoringproperty); } public static void setismonitoring(dependencyobject obj, bool value) { obj.setvalue(ismonitoringproperty, value); } public static readonly dependencyproperty ismonitoringproperty = dependencyproperty.registerattached("ismonitoring", typeof(bool), typeof(passwordboxmonitor), new uipropertymetadata(false, onismonitoringchanged)); public static int getpasswordlength(dependencyobject obj) { return (int)obj.getvalue(passwordlengthproperty); } public static void setpasswordlength(dependencyobject obj, int value) { obj.setvalue(passwordlengthproperty, value); } public static readonly dependencyproperty passwordlengthproperty = dependencyproperty.registerattached("passwordlength", typeof(int), typeof(passwordboxmonitor), new uipropertymetadata(0)); private static void onismonitoringchanged(dependencyobject d, dependencypropertychangedeventargs e) { var pb = d as passwordbox; if (pb == null) { return; } if ((bool)e.newvalue) { pb.passwordchanged += passwordchanged; } else { pb.passwordchanged -= passwordchanged; } } static void passwordchanged(object sender, routedeventargs e) { var pb = sender as passwordbox; if (pb == null) { return; } setpasswordlength(pb, pb.password.length); } }
xmal代码
<passwordbox name="pb" width="120" verticalalignment="bottom" height="35"> <passwordbox.style> <style targettype="passwordbox"> <setter property="height" value="23"/> <setter property="horizontalalignment" value="left"/> <setter property="verticalalignment" value="top"/> <setter property="local:passwordboxmonitor.ismonitoring" value="true"/> <setter property="template"> <setter.value> <controltemplate targettype="{x:type passwordbox}"> <border name="bd" background="{templatebinding background}" borderthickness="{templatebinding borderthickness}" borderbrush="{templatebinding borderbrush}" snapstodevicepixels="true"> <grid> <scrollviewer x:name="part_contenthost" snapstodevicepixels="{templatebinding snapstodevicepixels}"/> <stackpanel orientation="horizontal" visibility="collapsed" name="mystackpanel"> <textblock horizontalalignment="left" verticalalignment="center" foreground="lightgray" text="水印效果"/> </stackpanel> </grid> </border> <controltemplate.triggers> <trigger property="isenabled" value="false"> <setter property="visibility" targetname="mystackpanel" value="collapsed"/> </trigger> <trigger property="local:passwordboxmonitor.passwordlength" value="0"> <setter property="visibility" targetname="mystackpanel" value="visible"/> </trigger> </controltemplate.triggers> </controltemplate> </setter.value> </setter> </style> </passwordbox.style> </passwordbox>
效果图
2016-09-07 新增内容
将textblock暴露出来,做一个可以修改水印的textbox控件
<textbox x:class="oraclecodegenerator.watermarktextbox" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:oraclecodegenerator" mc:ignorable="d" d:designheight="300" d:designwidth="300" name="tb"> <textbox.resources> <visualbrush x:key="helpbrush" tilemode="none" opacity="0.3" stretch="none" alignmentx="left"> <visualbrush.visual> <textblock text="{binding tbtext,elementname=tb}" fontstyle="italic"/> </visualbrush.visual> </visualbrush> </textbox.resources> <textbox.style> <style targettype="textbox"> <setter property="height" value="23"/> <setter property="horizontalalignment" value="left"/> <setter property="verticalalignment" value="top"/> <style.triggers> <trigger property="text" value="{x:null}"> <setter property="background" value="{staticresource helpbrush}"/> </trigger> <trigger property="text" value=""> <setter property="background" value="{staticresource helpbrush}"/> </trigger> </style.triggers> </style> </textbox.style> </textbox>
public partial class watermarktextbox : textbox { public watermarktextbox() { initializecomponent(); } private string tbtext; public string tbtext { get { return tbtext; } set { tbtext = value; } } }
调用只有一句话
复制代码 代码如下:
<local:watermarktextbox width="150" tbtext="我是水印"/>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: WPF调用Matlab函数的方法