为什么 WPF 触发器必须声明为一种样式(甚至内联)?

Xav*_*ppé 6 wpf

我不明白为什么 WPF 允许我同时写

<Grid>
 <Grid.Triggers>
  <DataTrigger Binding="{Binding HasNeverBeenSeen}" Value="true">
   <Setter Property="Background" Value="Red"/>
  </DataTrigger>
 </Grid.Triggers>
</Grid>
Run Code Online (Sandbox Code Playgroud)

<Grid>
 <Grid.Style>
  <Style TargetType="{x:Type Grid}">
   <Style.Triggers>
    <DataTrigger Binding="{Binding HasNeverBeenSeen}" Value="true">
     <Setter Property="Background" Value="Red"/>
    </DataTrigger>
   </Style.Triggers>
  </Style>
 </Grid.Style>
</Grid>
Run Code Online (Sandbox Code Playgroud)

但只有第二个似乎有效。如果我们必须使用样式,为什么 Grid 元素有一个 Triggers 标签?

谢谢

Roh*_*ats 5

对您问题的简短回答是因为 WPF 团队就是这样设计的。

FrameworkElement.TriggersEventTriggers虽然属性是TriggerBase的集合,但只能有。MSDN 页面上也明确指出:

注意,在元素上建立的触发器集合只支持EventTrigger,不支持属性触发器(Trigger)。如果需要属性触发器,则必须将它们放置在样式或模板中,然后直接通过 Style 属性或通过隐式样式引用间接将该样式或模板分配给元素。