默认
获取焦点时
记得将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;
}