TextBlock上的DataTrigger无法按预期工作

时间:2016-10-05 07:52:34

标签: wpf xaml

我正在尝试通过以下代码实现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>

结果如下:

enter image description here

那么,上面的代码有什么问题吗?

顺便说一下,我用TextBox而不是PasswordBox尝试了它,它的效果与预期的一样。

3 个答案:

答案 0 :(得分:0)

编辑#1

在用户 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" />

来源:

https://stackoverflow.com/a/20342141/2819451

https://stackoverflow.com/a/27167280/2819451

答案 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; 
    }

}