WPF的PasswordBox样式以及占位符

默认

获取焦点时

记得将style绑定到passwordbox上 Style="{StaticResource CustomPasswordBoxStyle}"

        <Style x:Key="CustomPasswordBoxStyle" TargetType="PasswordBox">
            <Setter Property="Background" Value="#f5f5f5"/>
            <Setter Property="Foreground" Value="DarkSlateBlue"/>
            <Setter Property="Padding" Value="5 7 0 0"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="BorderBrush" Value="#999999"></Setter>
            <Setter Property="Foreground" Value="#666666"></Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type PasswordBox}">
                        <Border Background="{TemplateBinding Background}"
            BorderBrush="Transparent" 
                Name="border"
            BorderThickness="{TemplateBinding BorderThickness}"
            CornerRadius="3">
                            <StackPanel>
                                
                            <TextBlock  Foreground="#666" Margin="7" Text="请输入" x:Name="Platext" Visibility="Visible" HorizontalAlignment="Left" VerticalAlignment="Center" ></TextBlock>

                            <!-- 圆角大小 -->
                                <ScrollViewer  x:Name="PART_ContentHost"  HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"/>
                            </StackPanel>

                        </Border>
                        <!-- 输入时边框颜色 -->
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsKeyboardFocused" Value="True">
                                <Setter TargetName="border" Property="BorderBrush" Value="#5EA3FF"/>
                                <Setter TargetName="Platext" Property="Visibility" Value="Collapsed"/>

                                <Setter Property="Foreground" Value="#333333"/>
                                <Setter Property="Background" Value="#E0EDFF"/>
                            </Trigger>
                            <Trigger Property="PasswordChar" Value="">
                                <Setter TargetName="Platext" Property="Visibility" Value="Visible"/>
                            </Trigger>

                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>

        </Style>

注意,需要在passwordbox的获取焦点和失去焦点时将模版中的Platext隐藏

在获取焦点GotFocus事件中通过调用FindChild函数(在下方)获取模版中的占位符控件,然后赋值Visibility属性为Collapsed,

// miwentextbox是passwordbox的name,Platext是模版中占位符控件
var textBlock = FindChild<TextBlock>(miwentextbox, "Platext");
textBlock.Visibility = Visibility.Collapsed;

 失去焦点LostFocus事件中判断passwordbox的Password属性长度是否大于0

     // miwentextbox是passwordbox的name,Platext是模版中占位符的name
     int length = miwentextbox.Password.Length;
     var textBlock = FindChild<TextBlock>(miwentextbox, "Platext");

     if (length > 0)
     {
         textBlock.Visibility = Visibility.Collapsed;
     }
     else
     {
         textBlock.Visibility = Visibility.Visible;

     }
       /// <summary>
       /// 查找器,查找style模版中的控件
       /// </summary>
       /// <typeparam name="T"></typeparam>
       /// <param name="parent"></param>
       /// <param name="childName"></param>
       /// <returns></returns>
       public static T FindChild<T>(DependencyObject parent, string childName) where T : DependencyObject
       {
           if (parent == null) return null;

           int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
           for (int i = 0; i < childrenCount; i++)
           {
               var child = VisualTreeHelper.GetChild(parent, i);
               if (child is T result && child.GetValue(FrameworkElement.NameProperty) as string == childName)
               {
                   return result;
               }
               var nestedResult = FindChild<T>(child, childName);
               if (nestedResult != null) return nestedResult;
           }
           return null;
       }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值