绑定到 ControlTemplate.Triggers Setter 中的控件 属性
Bind to Control Property in ControlTemplate.Triggers Setter
我正在为 Button
实施 ControlTemplate
。如果鼠标悬停在按钮上,我想将背景颜色更改为稍微亮一点的颜色。为此,我实现了一个 IValueConverter
,它基于另一个 SolidColorBrush
.
的 Color
创建了一个新的 SolidColorBrush
我正在尝试在 Trigger
的 Setter
中使用 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>
要使其正常工作,您需要使用 Style
为 Trigger
设置初始 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
。
我正在为 Button
实施 ControlTemplate
。如果鼠标悬停在按钮上,我想将背景颜色更改为稍微亮一点的颜色。为此,我实现了一个 IValueConverter
,它基于另一个 SolidColorBrush
.
Color
创建了一个新的 SolidColorBrush
我正在尝试在 Trigger
的 Setter
中使用 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>
要使其正常工作,您需要使用 Style
为 Trigger
设置初始 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
。