Стиль WPF Passwordbox
В настоящее время я пытаюсь сделать следующее: Если пароль не введен, то должен быть показан текст "пароль".
Но в моем шаблоне пароль не отображается, и если я использую декоратор или scrollviewer, я не могу изменить цвет текста.Есть ли у вас какие-либо идеи для достижения этой цели?
Вот мой код стиля:
<Style TargetType="{x:Type PasswordBox}" x:Key="Password">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="PasswordBox">
                    <Grid>
                        <PasswordBox Background="{StaticResource BrushDark}" Foreground="{StaticResource BrushTextNormal}" BorderBrush="{StaticResource BrushBorderInput}" BorderThickness="1"/>
                        <TextBlock HorizontalAlignment="Left"
                            VerticalAlignment="Center"
                            Text="Password"
                            Margin="5,0,5,0"
                            Foreground="#ff808080"
                            IsHitTestVisible="False"
                            x:Name="UserMessage"
                            Visibility="Hidden"/>
                        <!--<ScrollViewer Foreground="{StaticResource BrushTextNormal}" Background="{StaticResource BrushTextNormal}" x:Name="PART_ContentHost"/>-->
                        <!--<Decorator TextBlock.Foreground="White" x:Name="PART_ContentHost"/>-->
                    </Grid>
                    <ControlTemplate.Triggers>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="Tag" Value=""/>
                                <Condition Property="IsKeyboardFocusWithin" Value="False"/>
                            </MultiTrigger.Conditions>
                            <Setter Property="Visibility" TargetName="UserMessage" Value="Visible"/>
                        </MultiTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
1 ответ:
Если вы создаете пользовательский
ControlTemplateдляPasswordBoxилиTextBox, вам нужно поместитьScrollViewerименованныйx:Name="PART_ContentHostвместо внутреннегоPasswordBoxFrom PasswordBox Syles and Templates
PART_ContentHost-визуальный элемент, который может содержать элемент FrameworkElement. В этом элементе отображается текст поля PasswordBox.
И измениться
Foregroundкак другойSetterв васStyle. Кроме того, как побочный узел, я бы сделал то же самое сBackgroundи использовалTemplateBindingв вашемControlTemplate. Это даст больше гибкость и позволяет изменятьBackgroundи / илиForegroundвручную без измененияControlTemplate<Style TargetType="{x:Type PasswordBox}" x:Key="Password"> <Setter Property="Foreground" Value="{StaticResource BrushTextNormal}" /> <Setter Property="Background" Value="{StaticResource BrushDark}"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type PasswordBox}"> <Grid Background="{TemplateBinding Background}"> <ScrollViewer x:Name="PART_ContentHost" .../> <TextBlock .../> </Grid> <ControlTemplate.Triggers> <!-- removed --> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>