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

Bind to Control Property in ControlTemplate.Triggers Setter

我正在为 Button 实施 ControlTemplate。如果鼠标悬停在按钮上,我想将背景颜色更改为稍微亮一点的颜色。为此,我实现了一个 IValueConverter,它基于另一个 SolidColorBrush.

Color 创建了一个新的 SolidColorBrush

我正在尝试在 TriggerSetter 中使用 IValueConverter。但是 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}。 None 其中的原因是我部分理解的。

我不能使用 Style 来定义 Trigers,因为我稍后会引用 ControlTemplate 的部分,这些部分对于样式来说是未知的。

有没有办法存档这样的绑定,或者那是不可能的?

直接更改按钮的 Background 属性 可能会导致无休止的更新循环,因为目标 属性 与按钮的源 属性 相同绑定。

触发器中的 Setter 应该以 ControlTemplate 中的元素为目标,例如一个 top-level 边框:

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

要使其正常工作,您需要使用 StyleTrigger 设置初始 Background,而不是直接在 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