1

我有两种风格,几乎相同:

<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" />

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

4

3 回答 3

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>
于 2013-09-12T13:16:25.867 回答
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>
于 2013-09-12T13:57:32.220 回答
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你的 -propertyPathButton来改变它的外观。

于 2013-09-12T13:11:09.923 回答