WPF - 覆盖样式颜色,最佳实践

时间:2009-08-15 18:18:14

标签: wpf styles button

我有一个GlassButton的样式。问题是渐变是在样式中构建的,颜色是在渐变中设置的。现在,我有一个我喜欢的按钮框架,但我需要不同的按钮才能有不同的颜色。有没有什么方法可以“暴露”样式中的一个或多个颜色属性,以便在我的按钮实现中覆盖?风格如下:

如果没有,那么做这样的事情的最佳做法是什么?我不想为每种颜色创建不同的样式,例如“GlassButtonBlue,GlassButtonGreen,GlassButtonRed” - 看起来有点矫枉过正......

<Style x:Key="GlassButton" TargetType="{x:Type Button}">
    <Setter Property="FontSize" Value="42" />
    <Setter Property="Foreground" Value="White" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border x:Name="ButtonBorder" 
                          CornerRadius="25,25,25,25" 
                          BorderThickness="4,4,4,4" 
                          Background="CadetBlue"
                          BorderBrush="#99FFFFFF"
                          RenderTransformOrigin="0.5,0.5">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*"/>
                            <RowDefinition Height="2.6*"/>
                        </Grid.RowDefinitions>
                        <Border Grid.Row="0" CornerRadius="23,23,0,0">
                            <Border.Background>
                                <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                                    <GradientStop x:Name="test" Color="#08FFFFFF" Offset="0"/>
                                    <GradientStop Color="#88FFFFFF" Offset="1"/>
                                </LinearGradientBrush>
                            </Border.Background>
                        </Border>
                        <ContentPresenter x:Name="ButtonContentPresenter"                               
                            VerticalAlignment="Center"  
                            Grid.RowSpan="2" 
                            HorizontalAlignment="Center"/>
                    </Grid>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter Property="RenderTransform" TargetName="ButtonBorder">
                            <Setter.Value>
                                <TransformGroup>
                                    <ScaleTransform ScaleX="0.9" ScaleY="0.9"/>
                                </TransformGroup>
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

1 个答案:

答案 0 :(得分:2)

此案例演示了attached properties的良好用法,可以在GlassButton控件(实际类型为Button)上定义,以便XAML中的值可以绑定到它们。一个简单的模板绑定({TemplateBinding MyAttachedProperty})应该可以胜任。

如果您需要特定部分的帮助,请告诉我们。