使用标记元素绑定颜色的WPF



我想创建一个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,而是使用在运行时解析的模式设置为TemplatedParentRelativeSource

TemplateBinding在编译时解析,但当应用staticResource时,标记的实际值将在运行时解析。这就是为什么你应该使用另一种方法。

<GradientStop Color="{Binding Tag, RelativeSource={RelativeSource
                                       Mode=TemplatedParent}}" Offset="0.0"/>

最新更新