软件编程
位置:首页>> 软件编程>> C#编程>> WPF TextBox和PasswordBox添加水印

WPF TextBox和PasswordBox添加水印

作者:眾尋  发布时间:2021-09-30 16:06:02 

标签: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>

效果图

WPF TextBox和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

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com