我正在尝试为 WPF 中的 TextBox 实现“提示文本”功能。我可以很好地设置默认文本,但是当我希望控件将其外观返回到普通的 TextBox 时,问题就来了。这是我到目前为止的触发器:
触发器 A
<Trigger Property="Text" Value="{x:Static sys:String.Empty}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBox">
<TextBox>
<TextBox.Background>
<VisualBrush AlignmentX="Left" AlignmentY="Center" Stretch="UniformToFill">
<VisualBrush.Visual>
<Label Content="{TemplateBinding TextBox.Tag}" Background="White"/>
</VisualBrush.Visual>
</VisualBrush>
</TextBox.Background>
</TextBox>
</ControlTemplate>
</Setter.Value>
</Setter>
</Trigger>
当属性为空时,这会将 设置Background
为 a 。当用户选择要输入的文本时,我需要做的是清除这一点。VisualBrush
Text
ControlTemplate
TextBox
这是我尝试过的:
触发器 B
<Trigger Property="IsKeyboardFocused" Value="True">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBox">
<TextBox/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Trigger>
这两个不能一起工作。我通过改变Background
颜色来测试每一个。如果我注释掉其中任何一个,它们都会起作用。如果两者都未注释,则触发器 A 有效,而 B 永远不会出现。如何删除/覆盖触发器 A?
我知道当不再满足触发条件时,这些模板的功能应该被清除,但是例如,当我输入文本时,触发器 A 的设置不会消失TextBox
。像 Text 属性仍然是String.Empty
什么。
那么我错过了什么?
编辑:
这是整个风格(没有更多内容):
<UserControl.Resources>
<Style TargetType="TextBox" x:Key="FormsTextBox">
<Setter Property="Width" Value="45"/>
<Setter Property="Margin" Value="3 2 3 2"/>
<Style.Triggers>
<Trigger Property="Text" Value="{x:Static sys:String.Empty}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBox">
<TextBox>
<TextBox.Background>
<VisualBrush AlignmentX="Left" AlignmentY="Center" Stretch="UniformToFill">
<VisualBrush.Visual>
<Label Content="{TemplateBinding TextBox.Tag}" Background="White" Width="45"/>
</VisualBrush.Visual>
</VisualBrush>
</TextBox.Background>
</TextBox>
</ControlTemplate>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>