我正在为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
所不熟悉的样式。
有什么办法可以存档这样的绑定吗?
答案 0 :(得分:2)
要使其正常工作,您需要使用Style
为Background
设置初始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>