我有一个ControlTemplate,它在多个元素中使用相同的颜色。在某些触发器(例如OnMouseOver)上,我想改变那种颜色。据我所知,我必须为每个元素定义一个setter来改变它的颜色。有没有办法在模板中引用所有包含的元素都可以访问的共享资源,哪些可以通过触发器更改,所以我不必解决每个元素?
这是一个(组成的)例子:
<ControlTemplate x:Key="myTemplate" TargetType="{x:Type Button}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Ellipse Fill="red" Grid.Column="0"/>
<Ellipse Fill="red" Grid.Column="1"/>
<ContentPresenter Grid.ColumnSpan="2" VerticalAlignment="Center"/>
</Grid>
</ControlTemplate>
当控件被禁用时,我希望椭圆是灰色的,而不是明确地设置它们,例如我不想要写
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="_ellipse1" Property="Fill" Value="Grey"/>
<Setter TargetName="_ellipse2" Property="Fill" Value="Grey"/>
</Trigger>
但只用一个设置器设置两个省略号的颜色。
答案 0 :(得分:2)
将触发器放在椭圆的样式(ellipsi?)而不是按钮上。如果在Button上设置IsEnabled = false,则IsEnabled将向下传播。
<ControlTemplate x:Key="myTemplate" TargetType="{x:Type Button}">
<ControlTemplate.Resources>
<Style TargetType="{x:Type Ellipse}">
<Setter Property="Fill" Value="Red" />
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Fill" Value="Gray" />
</Trigger>
</Style.Triggers>
</Style>
</ControlTemplate.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Ellipse Grid.Column="0"/>
<Ellipse Grid.Column="1"/>
<ContentPresenter Grid.ColumnSpan="2" VerticalAlignment="Center"/>
</Grid>
</ControlTemplate>
答案 1 :(得分:1)
我认为最好的方法是使用值转换器。然后你可以完全避免一个混乱的触发器。这是你的例子,但添加了一个转换器。
<Window.Resources>
<local:EnabledToColorConverter x:Key="enabledToColorConverter"/>
<ControlTemplate x:Key="myTemplate" TargetType="{x:Type Button}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Ellipse Name="_ellipse1" Fill="{TemplateBinding IsEnabled, Converter={StaticResource enabledToColorConverter}}" Grid.Column="0"/>
<Ellipse Name="_ellipse2" Fill="{TemplateBinding IsEnabled, Converter={StaticResource enabledToColorConverter}}" Grid.Column="1"/>
<ContentPresenter Grid.ColumnSpan="2" VerticalAlignment="Center"/>
</Grid>
</ControlTemplate>
</Window.Resources>
<StackPanel>
<Button Template="{StaticResource myTemplate}">Enabled Button</Button>
<Button Template="{StaticResource myTemplate}" IsEnabled="False">Disabled Button</Button>
</StackPanel>
这是转换器:
public class EnabledToColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
bool isEnabled = (bool)value;
return isEnabled ?
Brushes.Red :
Brushes.Gray;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}