我指的是数据触发器
上的代码块here<Window x:Class="WpfTutorialSamples.Styles.StyleDataTriggerSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="StyleDataTriggerSample" Height="200" Width="200">
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<CheckBox Name="cbSample" Content="Hello, world?" />
<TextBlock HorizontalAlignment="Center" Margin="0,20,0,0" FontSize="48">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Text" Value="No" />
<Setter Property="Foreground" Value="Red" />
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=cbSample, Path=IsChecked}" Value="True">
<Setter Property="Text" Value="Yes!" />
<Setter Property="Foreground" Value="Green" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</StackPanel>
</Window>
对我来说,从编程语言设计的角度来看,行<Style TargetType="TextBlock">
完全没必要,因为它已经嵌套在<TextBlock>
中,所以当然应该将任何setter属性应用于{ {1}}类型。那么为什么需要行TextBlock
?
除<Style TargetType="TextBlock">
以外,<Style TargetType>
可以是其他类型吗?
答案 0 :(得分:2)
您可以使用派生自的任何类TextBlock
(例如FrameworkElement
)。
例如,如果您实现自己的CustomizedTextBlock
,则可以在项目中使用为TextBlock
定义的样式。
您可以找到此here的示例。
答案 1 :(得分:1)
那么为什么需要这条线?
Style可以定义为资源,即不是内联的,如果没有指定TargetType
,XAML解析器应该如何解析它并设置由安装者?它不可能。或者至少它没有。
仅仅因为你可以定义Style
内联,你仍然在创建一个完全相同的类的实例,可以用作(全局)资源,然后设置{{1确实是必需的。
可以是TextBlock以外的其他类型吗?
不,除了源自TargetType
的类型。如果指定另一种类型,则在解析BAML(已编译的XAML)时将在运行时获得异常。