我正在尝试通过以下代码实现PasswordBox的占位符文本:
<PasswordBox x:Name="passwordText"/>
<TextBlock IsHitTestVisible="False" Text="Password">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Password, ElementName=passwordText}" Value="">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
结果如下:
那么,上面的代码有什么问题吗?
顺便说一下,我用TextBox而不是PasswordBox尝试了它,它的效果与预期的一样。
答案 0 :(得分:0)
在用户 clemens 评论后,我更正了答案的语言。
Password
属性没有更改通知,因此无法在此处运行。 Password
属性不是DP。
您必须使用事件处理程序的普通方法。使用PasswordBox.PasswordChanged
事件。
答案 1 :(得分:0)
正如@Anjum所提到的那样。出于某些安全原因,Password
中的PasswordBox
属性不是依赖属性。因此,它不会通知Trigger
。
有一种解决方法
<Window.Resources>
<Style TargetType="{x:Type PasswordBox}" xmlns:sys="clr-namespace:System;assembly=mscorlib">
<Style.Resources>
<VisualBrush x:Key="CueBannerBrush" AlignmentX="Left" AlignmentY="Center" Stretch="None">
<VisualBrush.Visual>
<Label Content="Password" Foreground="LightGray"/>
</VisualBrush.Visual>
</VisualBrush>
</Style.Resources>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Password}" Value="{x:Null}">
<Setter Property="Background" Value="{StaticResource CueBannerBrush}" />
</DataTrigger>
<Trigger Property="IsKeyboardFocused" Value="True">
<Setter Property="Background" Value="White" />
</Trigger>
</Style.Triggers>
<Setter Property="Control.Foreground" Value="#4C2C66"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
</Window.Resources>
<PasswordBox Width="200" Height="75" />
来源:
答案 2 :(得分:0)
正如@AnjumSKhan建议的那样,我已经用PasswordBox.PasswordChanged
事件完成了它。如果有人遇到类似问题,请参阅为PasswordBox
添加占位符的代码。
在xaml文件中:
<Window.Resources>
<VisualBrush x:Key="PasswordPlaceHolderBrush" AlignmentX="Left" AlignmentY="Center" Stretch="None">
<VisualBrush.Visual>
<Label Content="Нууц үг" Foreground="DarkGray"/>
</VisualBrush.Visual>
</VisualBrush>
</Window.Resources>
<PasswordBox PasswordChanged="passwordText_PasswordChanged"
Background="{StaticResource PasswordPlaceHolderBrush}" x:Name="passwordText"/>
在代码背后:
private void passwordText_PasswordChanged(object sender, RoutedEventArgs e)
{
PasswordBox senderOb = (PasswordBox)sender;
if(senderOb.Password == "")
{
passwordText.Background = (VisualBrush) FindResource("PasswordPlaceHolderBrush");
}
else
{
passwordText.Background = Brushes.White;
}
}