0

我正在尝试为 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 。当用户选择要输入的文本时,我需要做的是清除这一点。VisualBrushTextControlTemplateTextBox

这是我尝试过的:

触发器 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>
4

1 回答 1

2

我看不到整个模板,但这看起来有点过于复杂。我假设您正在尝试实现水印文本。对于提示使用框标准ToolTip属性,默认情况下将在悬停时在弹出窗口中显示您的文本,TextBox但可以禁用此行为ToolTip并重用属性。您可以创建可重用Style的 - 我更喜欢 - for TextBox,如下所示:

<Window ...>
   <Window.Resources>
      <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
      <Style TargetType="{x:Type TextBox}" x:Key="WatermarkTextBoxStyle">
         <Setter Property="ToolTipService.IsEnabled" Value="False"/>
         <Setter Property="Template">
            <Setter.Value>
               <ControlTemplate TargetType="{x:Type TextBox}">
                  <Border Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}" 
                      BorderThickness="1" 
                      BorderBrush="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}">
                     <Grid>
                        <TextBlock Margin="5,0,0,0" 
                           Text="{TemplateBinding ToolTip}" 
                           Visibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Text.IsEmpty, Converter={StaticResource BooleanToVisibilityConverter}}" 
                           Opacity="0.5"/>
                        <ScrollViewer Name="PART_ContentHost"/>
                     </Grid>
                  </Border>
               </ControlTemplate>
            </Setter.Value>
         </Setter>
      </Style>
   </Window.Resources>

   <TextBox ToolTip="watermark text" Style="{StaticResource WatermarkTextBoxStyle}"/>
</Window>

或者,如果这是一次性的事情,那么你可以在没有任何Style或的情况下做这样的事情Template

<Grid Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}">
   <TextBlock Margin="5,0,0,0" 
      Text="watermark text" 
      Opacity="0.5" 
      Visibility="{Binding ElementName=myTextBox, Path=Text.IsEmpty, Converter={StaticResource BooleanToVisibilityConverter}}" />
   <TextBox Name="myTextBox" Background="Transparent" />
</Grid>
于 2013-06-11T08:54:17.900 回答