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,但它找不到那边的面板 :(
您可以从 Border
的 Style.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
.
我正在创建自己的单选按钮。我只想更改它的图形。他们看起来像他们想要的样子,但我无法改变 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,但它找不到那边的面板 :(
您可以从 Border
的 Style.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
.