Wpf 将setter添加到控件';不破坏ControlTemplate的s样式

Wpf 将setter添加到控件';不破坏ControlTemplate的s样式,wpf,Wpf,我有进度条的全局模板,但在其中一个模板上,我必须将其颜色绑定到另一个元素的状态。似乎如果我改变ProgressBar的样式,它就会失去ControlTemplate。我错过了什么 <Style TargetType="ProgressBar"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ProgressBa

我有进度条的全局模板,但在其中一个模板上,我必须将其颜色绑定到另一个元素的状态。似乎如果我改变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>


-->

在我看来,您应该使用两种不同的样式:

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

泛型:

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


这应该行得通。这里的要点是正确使用样式继承,因为一个是“基于”另一个的。这样,事情就不会中断您可以使用
BasedOn继承默认样式。这样,您将获得在基本样式中定义的所有特性,包括ControlTemplate:

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

....

谢谢!我不知道你可以根据类型。太棒了。