在不破坏ControlTemplate的情况下将setter添加到Control的样式

时间:2014-03-16 14:44:56

标签: wpf

我有进度条的全局模板,但是我必须将它的颜色绑定到另一个元素的状态。看来,如果我改变ProgressBar的风格,它就会失去ControlTemplate。我在这里缺少什么?

<Style TargetType="ProgressBar">           
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="ProgressBar">
            <Border Name="PART_Track" ... Background="{TemplateBinding Background}"  >
                <Rectangle Name="PART_Indicator" ... Fill="{TemplateBinding Foreground}" />
            </Border>
        </ControlTemplate>
    </Setter.Value>
</Setter>

<ProgressBar x:Name="PBar" Background="#d8d8d8">
<ProgressBar.Resources>
    <Style TargetType="{x:Type ProgressBar}" >
        <Setter Property="Foreground" Value="#6CC655"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsChecked, ElementName=toggleX, Mode=OneWay}" Value="True">
                <Setter Property="Foreground" Value="#FFFFFF"/>
            </DataTrigger>
        </Style.Triggers>-->
    </Style>
</ProgressBar.Resources>

2 个答案:

答案 0 :(得分:1)

在我看来,你应该使用两种不同的风格:

一个是通用的。 另一种是更具体的风格。

GENERIC:

<Style TargetType="{x:Type ProgressBar}">           
   <Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type ProgressBar}">
            <Border Name="PART_Track" ... Background="{TemplateBinding Background}"  >
                <Rectangle Name="PART_Indicator" ... Fill="{TemplateBinding Foreground}" />
            </Border>
        </ControlTemplate>
    </Setter.Value>
</Setter>

具体:

<Style TargetType="{x:Type ProgressBar}" BasedOn="{StaticResource {x:Type ProgressBar}}">        
   <Setter Property="Foreground" Value="#6CC655"/>  
   <Style.Triggers>
        <DataTrigger Binding="{Binding IsChecked, ElementName=toggleX, Mode=OneWay}" Value="True">
            <Setter Property="Foreground" Value="#FFFFFF"/>
        </DataTrigger>
    </Style.Triggers>
</Setter>

这应该有效。这里的要点是正确使用Style继承,因为一个是&#34;基于&#34;另一个。这样,事情就不应该破坏

答案 1 :(得分:1)

您可以使用BasedOn 继承默认样式。这样,您将获得以基本样式定义的所有属性,包括ControlTemplate:

<ProgressBar.Resources>
    <Style TargetType="{x:Type ProgressBar}"
           BasedOn="{StaticResource {x:Type ProgressBar}}">
    ....
</ProgressBar.Resources>