WPF TextBox和PasswordBox添加水印
作者:眾尋 时间:2021-09-30 16:06:02
本文实例为大家分享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
标签:WPF,TextBox,PasswordBox,水印
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Java开启JMX远程监控服务配置
2021-11-02 01:14:43
![](https://img.aspxhome.com/file/2023/2/72332_0s.png)
servlet异步请求的实现
2023-07-14 17:11:38
![](https://img.aspxhome.com/file/2023/4/57724_0s.png)
同时使用@LoadBalanced @RefreshScope注解负载均衡失效分析
2023-12-07 10:59:24
![](https://img.aspxhome.com/file/2023/7/62037_0s.png)
JavaMail实现带附件的邮件发送
2021-10-21 15:00:09
![](https://img.aspxhome.com/file/2023/9/61919_0s.jpg)
一篇文章超详细的介绍Java继承
2023-11-23 08:30:12
SpringBoot自动装配原理详解
2023-07-03 05:49:08
java实现Base64加密解密算法
2023-11-25 08:07:27
一文搞懂并学会使用SpringBoot的Actuator运行状态监控组件的详细教程
2022-01-31 10:28:23
![](https://img.aspxhome.com/file/2023/8/67488_0s.png)
C# Linq延迟查询的执行实例代码
2023-04-24 05:34:59
java 反射机制详解及实例代码
2023-01-31 10:26:08
WPF开发技巧之花式控件功能扩展详解
2022-07-13 05:56:52
![](https://img.aspxhome.com/file/2023/1/68621_0s.png)
使用@pathvariable与@requestparam碰到的一些问题及解决
2023-11-27 16:30:34
![](https://img.aspxhome.com/file/2023/9/60459_0s.png)
IDEA JavaWeb项目启动运行后出现404错误的解决方法
2022-05-19 01:22:11
![](https://img.aspxhome.com/file/2023/9/64149_0s.png)
Java中包装类和Arrays类的详细介绍
2023-12-03 22:04:13
SpringBoot使用自动配置xxxAutoConfiguration
2022-11-20 09:05:56
Java中List集合去重方法以及效率对比
2021-11-03 00:15:52
解决IntelliJ IDEA中鼠标拖动选择为矩形区域问题
2022-04-03 21:08:51
![](https://img.aspxhome.com/file/2023/6/65176_0s.png)
java 数据结构单链表的实现
2022-07-24 09:45:33
Java实现上传文件图片到指定服务器目录
2023-06-28 00:23:32
C#中常使用进度条的代码
2021-06-27 23:31:18