好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

WPF TextBox和PasswordBox添加水印

本文实例为大家分享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="我是水印"/>

 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://www.cnblogs.com/ZXdeveloper/p/4807209.html

dy("nrwz");

查看更多关于WPF TextBox和PasswordBox添加水印的详细内容...

  阅读:38次