绑定到ControlTemplate.Triggers Setter中的控件属性

时间:2019-07-23 10:12:12

标签: c# wpf controltemplate

我正在为ControlTemplate实现Button。如果鼠标悬停在按钮上方,我想将背景色更改为略带浅绿色。为此,我实现了IValueConverter,它基于另一个SolidColorBrush的{​​{1}}创建了一个新的Color

我正在尝试在SolidColorBrush的{​​{1}}中使用那个IValueConverter。但是Setter未创建。

Trigger

我已经尝试使用DataBinding并指定<ControlTemplate TargetType="Button"> <!-- Custom layout omited--> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Background" Value="{Binding Background, Converter={StaticResouce myConverter}}"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> TemplateBinding。我部分想出了这些原因,但都没有用。

我无法使用{RelativeSource Self}来定义{RelativeSource TemplatedParent},因为稍后我将引用Style所不熟悉的样式。

有什么办法可以存档这样的绑定吗?

2 个答案:

答案 0 :(得分:2)

要使其正常工作,您需要使用StyleBackground设置初始Trigger,而不是直接在Button上进行设置。这将删除绑定。

<Style TargetType="Button">
  <Setter Property="Background" Value="DimGray" />
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate
        TargetType="{x:Type Button}">
        <Border Margin="{TemplateBinding Margin}"
                Background="{TemplateBinding Background}"
                BorderBrush="{TemplateBinding BorderBrush}"
                BorderThickness="{TemplateBinding BorderThickness}"
                Padding="{TemplateBinding Padding}">
          <ContentPresenter HorizontalAlignment="Center"
                            VerticalAlignment="Center" />
        </Border>

        <ControlTemplate.Triggers>
          <Trigger Property="IsMouseOver"
                   Value="True">
            <Setter Property="Background"
                    Value="{Binding RelativeSource={RelativeSource Self},  
                            Path=Background, 
                            Converter={StaticResource myConverter}}">
            </Setter>
          </Trigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

与其使用转换器将鼠标上的Background变亮,不如使用它来操纵Opacity

答案 1 :(得分:1)

直接更改Button的Background属性可能会导致无休止的更新循环,因为target属性与Binding的source属性相同。

触发器中的设置器应以ControlTemplate中的元素为目标,例如顶级边界:

<ControlTemplate TargetType="Button">
    <Border x:Name="border" Background="{TemplateBinding Background}">
        ...
    </Border>                    
    <ControlTemplate.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter TargetName="border"
                    Property="Background"
                    Value="{Binding Background,
                            RelativeSource={RelativeSource TemplatedParent},
                            Converter={StaticResource myConverter}}"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>