在触发器中无法识别Setter TargetName'ContentPresenter'

时间:2016-09-19 17:58:17

标签: c# wpf

我有一个ContentPresenter,当Button被禁用时,内容的不透明度应该变为0.5,但是Setter无法通过TargetName找到它。有什么我想念的吗?

git status

2 个答案:

答案 0 :(得分:2)

对于此类问题,您需要了解NameScope的概念。 Template定义了自己的NameScope。因此,您的TargetName无法在模板外部使用。

因此,请尝试从ControlTemplate内部访问它。

答案 1 :(得分:1)

您可以使用ControlTemplate.Triggers通过Setters更改ContentPresenter属性。 “ContentPresenter”名称仅在模板中已知。

<Style TargetType="Button">
    <Style.Triggers>
        <Trigger Property="Tag" Value="MenuButton">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Border BorderThickness="1,0,0,1" Background="{TemplateBinding Background}">
                            <ContentPresenter
                                x:Name="ContentPresenter"
                                Margin="1"
                                VerticalAlignment="Center"
                                HorizontalAlignment="Center"
                                Opacity="1.0"/>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsEnabled" Value="False">
                                <Setter Property="Background" Value="{StaticResource DisabledBackgroundBrush}"/>
                                <Setter TargetName="ContentPresenter" Property="Opacity" Value="0.5"/>
                            </Trigger>

                            <Trigger Property="IsEnabled" Value="True">
                                <Setter Property="Background" Value="{StaticResource BackgroundBrush}"/>
                                <Setter TargetName="ContentPresenter" Property="Opacity" Value="1"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Trigger>

    </Style.Triggers>
</Style>