触发器中的WPF ControlTemplate样式GradientStop

时间:2009-06-05 05:20:18

标签: wpf xaml animation styles

这是我的TabItem的XAML。我希望能够在触发器中设置单个渐变色块的颜色。我知道我可以在触发器的setter中完全重新定义渐变,但我想访问背景上的特定属性,以便将来可以为它设置动画。

我已尝试触发器设置器中所有内容的每个变体并用Google搜索了很长时间 - 但我仍然无法编译它。我也尝试过class.property语法,但仍然没有。此代码引发的当前错误是:

“未找到类型'Background.GradientStops [0]'。”

我很确定我知道这里发生了什么 - 也许我想要的是不可能的。但必须有一种方法来在控件模板中设置控件的渐变动画......

任何人都可以帮助我吗? 感谢

<Style TargetType="{x:Type TabItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TabItem}">
                <TextBlock Padding="6 2 6 2" Name="TheHeader">
                    <TextBlock.Background>
                        <LinearGradientBrush StartPoint="0, 0" EndPoint="0, 1">
                            <GradientStop Offset="0" Color="#f4fafd" />
                            <GradientStop Offset="1" Color="#ceedfa" />
                        </LinearGradientBrush>
                    </TextBlock.Background>
                    <ContentPresenter ContentSource="Header" Margin="0" />
                </TextBlock>
                <ControlTemplate.Triggers >
                    <Trigger Property="IsSelected" Value="True">
                        <Setter TargetName="TheHeader" Property="Background.GradientStops[0].Color" Value="White" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

1 个答案:

答案 0 :(得分:1)

您可以对其进行动画处理,例如示例here

你也可以使用轻微的黑客来设置它,虽然我总是喜欢创建多个画笔作为资源并交换它们或者像你提到的那样重新创建画笔。

<Style TargetType="{x:Type TabItem}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TabItem}">
                    <TextBlock Padding="6 2 6 2"
                               Name="TheHeader" Tag="#f4fafd">
                                    <TextBlock.Background>
                                            <LinearGradientBrush StartPoint="0, 0"
                                                                 EndPoint="0, 1">
                                                    <GradientStop Offset="0" 
                                                                  Color="{Binding ElementName=TheHeader, Path=Tag}"/>
                                                    <GradientStop Offset="1"
                                                                  Color="#ceedfa" />
                                            </LinearGradientBrush>
                                    </TextBlock.Background>
                                    <ContentPresenter ContentSource="Header"
                                                      Margin="0" />
                    </TextBlock>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsSelected"
                                 Value="True">
                            <Setter TargetName="TheHeader"
                                    Property="Tag"
                                    Value="Red" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>