WPF PasswordBox видимость метки - PullRequest
1 голос
/ 25 мая 2011

Я создал пользовательский элемент управления паролем для экрана входа в систему. Я пытался использовать подход с водяными знаками, но большинство примеров, которые я видел, потерпели неудачу, когда я пытался их использовать. Я переключился на возможность манипулировать видимостью метки с помощью кода C #.

<Style x:Key="{x:Type PasswordBox}"
       x:Name="Style1"
       BasedOn="{StaticResource {x:Type PasswordBox}}"
       TargetType="{x:Type PasswordBox}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type PasswordBox}">
                <Border x:Name="TextBoxBorder" 
                        BorderBrush="{TemplateBinding BorderBrush}" 
                        BorderThickness="{TemplateBinding BorderThickness}"
                        CornerRadius="7">
                    <Border.Background>
                         <LinearGradientBrush StartPoint="0,0" EndPoint="2,1">
                              <GradientStop Color="{Binding Path=GradientColorStart}" 
                                            Offset="0"/>
                              <GradientStop Color="{Binding Path=GradientColorEnd}" 
                                            Offset="1"/>
                         </LinearGradientBrush>
                    </Border.Background>
                    <Grid>
                        <Label x:Name="TextPrompt" 
                               Content="Password" 
                               Focusable="False" 
                               FontSize="15"
                               Foreground="Green"
                               Visibility="Visible" />
                        <ScrollViewer x:Name="PART_ContentHost"  Margin="0" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                    </Grid> 
                 </Border>
                 <ControlTemplate.Triggers>
                     <Trigger Property="IsFocused" Value="True">
                         <Setter Property="Foreground"
                                 Value="{Binding Path=OnFocusTextColor}" />
                         <Setter Property="FontWeight"
                                 Value="{Binding Path=OnFocusFontWeight}" />
                         <Setter Property="FontStyle"
                                 Value="{Binding Path=OnFocusFontStyle}" />
                    </Trigger>
                </ControlTemplate.Triggers>
            <!--
                <ControlTemplate.Triggers>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsFocused" Value="False"/>
                            <Condition Property="Password" Value=""/>
                        </MultiTrigger.Conditions>
                        <Setter Property="Visibility"
                                TargetName="TextPrompt
                                Value="Visible"/>
                    </MultiTrigger>
                    <Trigger Property="IsFocused" Value="True">
                        <Setter Property="Foreground" Value="{Binding Path=OnFocusTextColor}" />
                        <Setter Property="FontWeight" Value="{Binding Path=OnFocusFontWeight}" />
                        <Setter Property="FontStyle" Value="{Binding Path=OnFocusFontStyle}" />
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter Property="Foreground" Value="DimGray" />
                    </Trigger> 
                </ControlTemplate.Triggers>
             -->
            </ControlTemplate> 
        </Setter.Value>
    </Setter>

Код для контроля

<PasswordBox x:Name="PasswordTest"
    FontSize="15"
    Padding="{Binding Path=TextPadding}"
    Tag="{Binding Path=TextValue}"
    PasswordChanged="PasswordTest_PasswordChanged">
</PasswordBox>

C # для PasswordTest_PasswordChanged

private void PasswordTest_PasswordChanged(object sender, RoutedEventArgs e)
{

}

Я пытался получить доступ к метке, но не уверен, как именно. Я попытался проанализировать отправителя как поле пароля, как другие примеры использования водяных знаков, но я не могу получить доступ к атрибуту пароля.

1 Ответ

0 голосов
/ 25 мая 2011

Вам нужно найти его в шаблоне:

Label textPrompt = null;
if (sender is PasswordBox && ((PasswordBox)sender).Template != null)
    textPrompt = ((PasswordBox)sender).Template.FindName("TextPrompt", (PasswordBox)sender) as Label;
...