代码之家  ›  专栏  ›  技术社区  ›  Tarsier

中的TemplatedParent绑定ControlTemplate.触发器

  •  3
  • Tarsier  · 技术社区  · 16 年前

    <ControlTemplate.Triggers>
      <Trigger Property="Text" Value="">
        <Setter TargetName="MyBorder" Property="Background">
          <Setter.Value>
            <VisualBrush Opacity="0.4" Stretch="None" TileMode="None">
              <VisualBrush.Visual>
                <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=BackgroundText}" />
              </VisualBrush.Visual>
            </VisualBrush>
          </Setter.Value>
        </Setter>
      </Trigger>
    </ControlTemplate.Triggers>
    

    但是,当文本为空时,不会应用视觉笔刷。但是,如果我在代码中创建可视化笔刷并将其作为依赖属性公开,则以下代码 工作:

    <ControlTemplate.Triggers>
      <Trigger Property="Text" Value="">
        <Setter TargetName="MyBorder" Property="Background" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=BackgroundBrush}" />
        </Setter>
      </Trigger>
    </ControlTemplate.Triggers>
    

    不过,我宁愿用XAML定义画笔。为什么第二个绑定工作正常,但第一个绑定不起作用?

    1 回复  |  直到 16 年前
        1
  •  1
  •   Brent    16 年前

    你想创建水印文本框吗?如果是这样,我通过向自定义控件添加TextBlock来创建我的控件,然后在触发器定义中引用它。当文本框没有焦点,并且控件中没有文本时,水印(TextBlock)将可见。一旦TexBox获得焦点,水印将被隐藏。然后水印的文本将绑定到BackgroundText属性。

    <ControlTemplate.Triggers>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsFocused" Value="false"/>
                <Condition Property="Text" Value="{x:Null}"/>
            </MultiTrigger.Conditions>
            <Setter TargetName="Watermark" Property="Visibility" Value="Visible"/>
        </MultiTrigger>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsFocused" Value="false"/>
                <Condition Property="Text" Value=""/>
            </MultiTrigger.Conditions>
            <Setter TargetName="Watermark" Property="Visibility" Value="Visible"/>
        </MultiTrigger>
    </ControlTemplate.Triggers>