你的位置:首页 > ASP.net教程

[ASP.net教程]【转】WPF TextBox和PasswordBox加水印


原文地址:http://www.w2bc.com/Article/14488

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>

效果图