Связывание TemplatedParent в ControlTemplate.Triggers - PullRequest
3 голосов
/ 13 января 2010

Когда его текст пуст, я пытаюсь установить фон пользовательского элемента управления для визуальной кисти, используя триггер в шаблоне ControlTemplate. Ниже показан соответствующий код:

<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 Ответ

1 голос
/ 13 января 2010

Вы пытаетесь создать водяной знак TextBox? Если так, я создал мой, добавив TextBlock в пользовательский элемент управления, а затем сослался на это в определениях Trigger. Когда TextBox не имеет фокуса, и в элементе управления нет текста, водяной знак (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>
...