如何清除触发的控制模板

时间:2013-06-11 00:52:52

标签: wpf .net-4.0 triggers controltemplate

我正在尝试在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属性为空时,这会将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?

我知道这些模板的功能应该在不再满足触发条件时清除,但是例如,当我在TextBox中输入文本时,触发器A的设置不会消失。就像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>

1 个答案:

答案 0 :(得分:2)

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

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

<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>