WPF:影响样式触发器的边框

WPF: affect border from style triggers

我正在创建自己的单选按钮。我只想更改它的图形。他们看起来像他们想要的样子,但我无法改变 IsChecked 一个的外观......这就是我目前所拥有的

<RadioButton x:Class="gMaterialWPF.MaterialRadioButton" [....]>
    <RadioButton.Style>
        <Style TargetType="{x:Type RadioButton}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type RadioButton}">
                        <Border x:Name="backPanel" 
                            Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="10">

                        <ContentPresenter HorizontalAlignment="Center"
                                          VerticalAlignment="Center"
                                          Content="{TemplateBinding Content}"
                                          />
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <Trigger Property="IsChecked" Value="True">
                    <Setter Property="Background" Value="Red"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </RadioButton.Style>
</RadioButton>

问题是如何访问 backPannel 以更改 <Trigger Property="IsChecked" 的颜色???我尝试使用 TargetName,但它找不到那边的面板 :(

您可以从 BorderStyle.Triggers 访问 RadioButton.IsChecked

<ControlTemplate TargetType="{x:Type RadioButton}">
    <Border x:Name="backPanel" 
Background="{TemplateBinding Background}"                            
BorderThickness="10">
        <Border.Style>
            <Style TargetType="{x:Type Border}">                                            
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsChecked, RelativeSource={RelativeSource AncestorType=RadioButton}}" Value="true">
                        <DataTrigger.Setters>
                            <Setter Property="BorderBrush" Value="Green"/>
                        </DataTrigger.Setters>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding IsChecked, RelativeSource={RelativeSource AncestorType=RadioButton}}" Value="false">
                        <DataTrigger.Setters>
                            <Setter Property="BorderBrush" Value="Yellow"/>
                        </DataTrigger.Setters>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Border.Style>

        <ContentPresenter HorizontalAlignment="Center"
                VerticalAlignment="Center"
                Content="{TemplateBinding Content}"
                />
    </Border>
</ControlTemplate>

I tried with TargetName but it cannot find the panel over there :(

如果您希望能够使用 TargetName 属性:[=22= 引用 Border 元素,则需要将触发器移至 ControlTemplate ]

<Style TargetType="{x:Type RadioButton}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type RadioButton}">
                <Border x:Name="backPanel" 
                            Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="10">

                    <ContentPresenter HorizontalAlignment="Center"
                                          VerticalAlignment="Center"
                                          Content="{TemplateBinding Content}"
                                          />
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsChecked" Value="True">
                        <Setter TargetName="backPanel" Property="Background" Value="Red"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

但是由于您使用TemplateBinding 在您的示例中,您实际上不必使用 TargetName.