C# WPF使用Tag元素绑定颜色

C# WPF使用Tag元素绑定颜色,c#,wpf,xaml,templates,C#,Wpf,Xaml,Templates,我想创建一个滑块,它有一个从黑色到特定颜色的渐变作为背景。 颜色将附加到滑块的样式中。另外,仅使用控件模板(即没有附加属性和派生控件)无法向给定控件添加额外属性 因此,我想使用Tag属性并创建了以下代码段: <Style x:Key="ColorSlider" TargetType="{x:Type Slider}"> <Setter Property="Template"> <Setter.Value> <

我想创建一个滑块,它有一个从黑色到特定颜色的渐变作为背景。 颜色将附加到滑块的样式中。另外,仅使用控件模板(即没有附加属性和派生控件)无法向给定控件添加额外属性

因此,我想使用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
作为静态资源(尽管我更喜欢直接使用十六进制代码或预定义颜色键入颜色)


但是,这不起作用,知道为什么吗?

不要使用编译时解析的
模板绑定
,而是使用
相对资源
,模式设置为运行时解析的
模板parent

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

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

不要使用编译时解析的
模板绑定
,而是使用
相对资源
,模式设置为运行时解析的

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

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

不要使用编译时解析的
模板绑定
,而是使用
相对资源
,模式设置为运行时解析的

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

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

不要使用编译时解析的
模板绑定
,而是使用
相对资源
,模式设置为运行时解析的

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

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


谢谢,很好用。不过,您能否解释一下,为什么在这种情况下,在运行时解析绑定而不是在编译时解析绑定很重要?在回答中添加了更多详细信息。谢谢,这很好。不过,您能否解释一下,为什么在这种情况下,在运行时解析绑定而不是在编译时解析绑定很重要?在回答中添加了更多详细信息。谢谢,这很好。不过,您能否解释一下,为什么在这种情况下,在运行时解析绑定而不是在编译时解析绑定很重要?在回答中添加了更多详细信息。谢谢,这很好。但是,您能否解释一下,为什么在这种情况下,在运行时解析绑定而不是在编译时解析绑定很重要?在回答中添加了更多详细信息。