【发布时间】:2015-03-18 00:17:34
【问题描述】:
我定义了以下 ControlTemplate:
<ControlTemplate x:Key="buttonTemplate" TargetType="{x:Type Button}">
<Border x:Name="buttonBorder">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock x:Name="txtLabel" Grid.Column="0">
<ContentPresenter/>
</TextBlock>
<Canvas x:Name="reschedule" Grid.Column="1">
<Path x:Name="path1" ... />
<Path x:Name="path2" ... />
<Path x:Name="path3" ... />
<Path x:Name="path4" ... />
<Path x:Name="path5" ... />
<Path x:Name="path6" ... />
<Path x:Name="path7" ... />
<Path x:Name="path8" ... />
<Path x:Name="path9" ... />
<Path x:Name="path10" ... />
</Canvas>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="buttonBorder" Property="Background" Value="DarkGreen"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="buttonBorder" Property="Background" Value="DarkGray"/>
<Setter TargetName="txtLabel" Property="Foreground" Value="Gray"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
目前默认的 TextBlock Foreground 和 Path Fill 属性已设置为 White。当按钮被禁用时,我想将这些属性设置为Gray。现在它适用于TextBlock,我也可以通过定位每个名称来使其适用于Paths,但是有没有办法按类型定位所有Path元素?比如:
<Setter TargetType="Path" Property="Fill" Value="Gray"/>
我尝试将以下触发器添加到 Border 元素的样式中,但它不起作用:
<Border.Style>
<Style TargetType="Border">
<Style.Resources>
<Style TargetType="Path">
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Fill" Value="Gray"/>
</Trigger>
</Style.Triggers>
</Style>
</Style.Resources>
</Style>
</Border.Style>
【问题讨论】:
-
是的,在您的风格中使用
TargetType="{x:Type Path}",这应该针对Path类型的所有元素。 HTH -
看起来没有在样式块中定义的触发器没有
TargetType属性 -
在问题中你有这个 xaml
<Border.Style><Style TargetType="Border"><Style.Resources>这是你放置你的 TargetType="{x:Type Path}" 的地方。所以不要使用<Style TargetType="Path",而是使用TargetType="{x:Type Path}"。顺便说一句,将此样式放在模板定义之外,否则将不会对其进行评估。 HTH -
太棒了,谢谢!我以为
TargetType="Path"和TargetType="{x:Type Path}"是相同的......?无论哪种方式,它似乎都有效。起作用的是我必须将我的样式从模板定义中取出,然后按键引用该样式。 -
如果你愿意我可以创建一个答案并向你解释
TargetType="Path"和TargetType="{x:Type Path}"之间的区别?
标签: wpf xaml triggers controltemplate targettype