我想创建一个Slider,它有一个从黑色到特定颜色的渐变作为背景。该颜色将附加到"滑块的样式"中进行设置。AFAIK,仅使用控制模板(即,没有附加属性,也没有派生控件)就不能向给定控件添加额外属性。
因此,我想使用Tag属性,并创建了以下片段:
<Style x:Key="ColorSlider" TargetType="{x:Type Slider}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Slider}">
<Grid>
<Rectangle Grid.Column="1" Grid.Row="1">
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1" >
<GradientStop Color="{TemplateBinding Tag}" Offset="0.0"/>
<GradientStop Color="Black" Offset="1.0"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
....
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
并像这样使用:
<Slider Style="{StaticResource ColorSlider}" Width="100" Height="500" Tag="{StaticResource redColor}"/>
redColor
是静态资源(尽管我更喜欢直接使用HEX代码或预定义的颜色键入颜色)。
然而,这不起作用,你知道为什么吗?
不要使用在编译时解析的TemplateBinding
,而是使用在运行时解析的模式设置为TemplatedParent
的RelativeSource
。
TemplateBinding在编译时解析,但当应用staticResource时,标记的实际值将在运行时解析。这就是为什么你应该使用另一种方法。
<GradientStop Color="{Binding Tag, RelativeSource={RelativeSource
Mode=TemplatedParent}}" Offset="0.0"/>