如何在没有自定义控件的情况下在xaml中创建参数化样式

时间:2013-09-12 13:02:55

标签: wpf xaml

我有两种风格几乎完全相同:

<Style x:Key="CancelButtonStyle" TargetType="{x:Type Button}" >
    <!-- gigantic common code -->
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <!-- more common code -->
                <Path Data="DIFFERENT_VALUE_A"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style x:Key="OkButtonStyle" TargetType="{x:Type Button}" >
    <!-- gigantic common code -->
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <!-- more common code -->
                <Path Data="DIFFERENT_VALUE_B"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

我想提取公共代码(“样式模板”),然后像这样使用它:

<Style x:Key="OkButtonStyle" Base="PathButtonStyle" PathData="DIFFERENT_VALUE_B" />

编辑: 正如我在标题中指定的那样,我不想创建自己的控件

3 个答案:

答案 0 :(得分:3)

只需在ControlTemplate中单独定义Resources个对象:

<ControlTemplate x:Key="ControlTemplate1">
    <!-- different part -->
</ControlTemplate>

<ControlTemplate x:Key="ControlTemplate2">
    <!-- different part -->
</ControlTemplate>

为公共部分创建一个Style

<Style x:Key="BaseStyle" TargetType="{x:Type Button}" >
    <!-- gigantic common code -->
</Style>

然后将新样式基于该样式,引用新的ControlTemplate

<Style x:Key="CancelButtonStyle" TargetType="{x:Type Button}" 
    BasedOn="{StaticResource BaseStyle}">
    <Setter Property="Template" Value="{StaticResource ControlTemplate1}" />
</Style>

<Style x:Key="OkButtonStyle" TargetType="{x:Type Button}"
    BasedOn="{StaticResource BaseStyle}">
    <Setter Property="Template" Value="{StaticResource ControlTemplate2}" />
</Style>

答案 1 :(得分:1)

您可以使用Tag传递PathData:

<Style x:Key="BaseStyle" TargetType="{x:Type Button}" >
    <!-- gigantic common code -->
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <!-- more common code -->
                <Path Data="{TemplateBinding Tag}"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

然后在您的个人风格中设置标记:

<Style x:Key="CancelButtonStyle" TargetType="{x:Type Button}" 
    BasedOn="{StaticResource BaseStyle}">
    <Setter Property="Tag" Value="MY PAth A" />
</Style>

<Style x:Key="OkButtonStyle" TargetType="{x:Type Button}"
    BasedOn="{StaticResource BaseStyle}">
    <Setter Property="Tag" Value="MY PAth B" />
</Style>

答案 2 :(得分:0)

您可以创建自己的Button,它源自Wpf-Button并具有PathData属性:

public class PathButton:Button
{
    public string PathData {get;set;}
}

你的风格可能是:

<Style x:Key="PathButtonStyle" TargetType="{x:Type ns:PathButton}" >
    <!-- gigantic common code -->
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <!-- more common code -->
                <Path Data="{TemplateBinding PathData}"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

要使用它,你必须这样做:

<ns:PathButton Style="{StaticResource PathButtonStyle}" PathData="M200 200 100 100 L0 0"/>

或者您创建自己的Custom Control,方式也是一样。

此处的广告无论您要使用多少个不同的按钮,资源中只有一个Style和一个类PathButton)。 您只需更改PathData的{​​{1}} - 属性即可更改其外观。