• 【转】WPF 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="我是水印"/>
  • 相关阅读:
    信息检索重点关键字
    信息检索重点关键字
    信息检索重点关键字
    信息检索关键词部分
    信息检索关键词部分
    信息检索关键词部分
    输入五个国家的名称按字母顺序排列输出
    把一个整数按大小顺序插入已排好序的数组中
    快放假了
    清炒苦瓜
  • 原文地址:https://www.cnblogs.com/ZXdeveloper/p/4807209.html
Copyright © 2020-2023  润新知