0

假设我有一个看起来像这样的风格:

<Style TargetType="{x:Type ScrollBar}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ScrollBar}">
                <Grid x:Name="Bg" Background="Grey">

                    <!-- Non-Relevant Stuff Here -->

                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

当滚动条被禁用时,我希望网格背景为红色。我可以这样做:

<Style TargetType="{x:Type ScrollBar}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ScrollBar}">
                <Grid x:Name="Bg" Background="Grey">

                    <!-- Non-Relevant Stuff Here -->

                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="False">
          <Setter Property="Template">
            <Setter.Value>
               <ControlTemplate TargetType="{x:Type ScrollBar}">
                   <Grid x:Name="Bg" Background="Red">

                       <!-- Non-Relevant Stuff Here -->

                   </Grid>
               </ControlTemplate>
           </Setter.Value>
        </Trigger>
    </Style.Triggers>
</Style>

但这重复了我的所有模板。因此,现在必须在两个地方进行任何更改。

如何获得此触发器以允许我仅更改模板中网格的背景?

(注意:为实际 ScrollBar 的 Background 属性添加 Setter 没有任何效果。)

4

2 回答 2

2

您需要让您的模板从其他地方获取背景值,通常是控件上的一个属性。例如:

<Grid x:Name="Bg" Background="{TemplateBinding Background}">

然后您的样式触发器可以简单地更改Background属性:

<Setter Property="Background" Value="Gray"/>

您可能还希望在您的样式中设置背景的默认值。所以你最终会得到这样的东西:

<Style TargetType="{x:Type ScrollBar}">
    <Setter Property="Background" Value="Gray"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ScrollBar}">
                <Grid x:Name="Bg" Background="{TemplateBinding Background}">

                    <!-- Non-Relevant Stuff Here -->

                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Background" Value="Red"/>
        </Trigger>
    </Style.Triggers>
</Style>
于 2013-03-22T21:18:21.193 回答
1

只需将其Trigger放入ControlTemplate而不是Style

<Style TargetType="{x:Type ScrollBar}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ScrollBar}">
                <Grid x:Name="Bg" Background="Grey">

                    <!-- Non-Relevant Stuff Here -->

                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled" Value="False">
                      <Setter TargetName="Bg" Property="Template" Value="Red"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
于 2013-03-23T01:44:16.410 回答