如何减少样式重复-带触发器的控制模板(XAML)

时间:2019-03-09 12:34:09

标签: wpf xaml

问题是我的样式文件由于重复而可憎行1万行。

例如,我有一个基于ButtonScaleMinus的{​​{1}}样式,但是我不能以相同的方式分隔ControlTemplate。有很多与边界名称绑定的触发器。

唯一的区别实际上是AllButtons的内容,因此所有相同的内容,只有一小段代码会有所不同。

<Border x:Name='ElementBorder'...

有什么方法可以将上面的代码简化成这样:

<Style x:Key='ButtonScaleMinus'
       TargetType='Button'
       BasedOn='{StaticResource AllButtons}'>

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border x:Name='ElementBorder'
                        CornerRadius="5"
                        BorderThickness="1"
                        Padding="0"
                        BorderBrush='{StaticResource border1}'
                        Background='{StaticResource MenuButtonGradient}'>
                    <Viewbox Margin='10'
                             x:Name='ViewBox'
                             VerticalAlignment="Center"
                             HorizontalAlignment="Center">
                        <Path Data='M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z'
                              Fill='White'
                              Stroke='White'
                              x:Name='faImage'/>
                    </Viewbox>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled"
                             Value="False">
                        <Setter Property="Opacity"
                                Value="0.2" />
                        <Setter Property="Foreground"
                                Value='LightGray' />
                    </Trigger>
                    <Trigger Property="IsMouseOver"
                             Value="True">
                        <Setter TargetName="ElementBorder"
                                Property="Background"
                                Value='{StaticResource DefaultButtonOverBackground}' />
                        <Setter Property="Cursor"
                                Value='Hand' />
                    </Trigger>
                    <Trigger Property="IsPressed"
                             Value="True">
                        <Setter TargetName="ElementBorder"
                                Property="Background"
                                Value='{StaticResource DefaultButtonPressedBackground}' />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

1 个答案:

答案 0 :(得分:0)

似乎您没有该按钮的内容,因此您为要使用的每个图标都有一个模板。

那是一个错误。

无论如何,您都可以简化那里的内容,设置拉伸路径,它将填充其中的容器,因此您可能会丢失视图框。

本质上,您需要路径的属性-几何(路径的数据),填充,斯托克以及您在其他模板中使用的其他任何东西。

都可以。

创建一个IconButton之类的东西,继承Button并为这些属性添加依赖项属性。

一个附加那些依赖属性的类。

将所有几何图形移动到资源字典中并为其提供密钥。

这是一个例子

<Geometry x:Key="FlowRight">
    M1.265625,12.9837493896484L95.625,50.7181243896484 1.265625,88.5462493896484 24.375,50.7181243896484 1.265625,12.9837493896484z
</Geometry>

然后可以将其用作StaticResource。

然后,您可以拥有一个IconButton模板。 如果您有很多(例如)加图标按钮,则定义样式可设置几何形状和画笔。

您可以直接在使用模板的Button / IconButton上直接设置或绑定这些属性。

两者都做。设置一个或两个属性以覆盖通用样式的那些属性。

也许对于您想做的事情不够灵活。

您可以使用ContentControl和样式/模板在模板中定义内容。

您可以将ContentPresenter添加到模板中,无论将按钮的内容设置为什么,都会在其中显示。