Стилизация WPF Passwordbox
В настоящее время я пытаюсь сделать следующее: Если пароль не введен, должен появиться текст "Пароль".
Но с моим шаблоном пароль не отображается, и если я использую декоратор или просмотрщик прокрутки, я не могу изменить цвет текста.
У вас есть идеи для достижения этой цели?
Вот мой код для стиля:
<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
вместо внутреннего PasswordBox
Из PasswordBox Syles и Шаблоны
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>