如何组合DataTrigger和EventTrigger?

Dre*_*kes 15 .net wpf xaml triggers datatrigger

注意我已经问过相关问题(有一个接受的答案):如何组合DataTrigger和Trigger?

我想我需要结合一个EventTrigger和一个DataTrigger来实现我所追求的目标:

  • 当一个项目出现在我的ListBox中时,它应该闪烁一会儿
  • 如果该项目是"严重",那么它应该保持突出显示

目前我有一个如下所示的DataTemplate:

<DataTemplate DataType="{x:Type Notifications:NotificationViewModel}">
    <Grid HorizontalAlignment="Stretch">
        <Border Name="Background" CornerRadius="8" Background="#80c0c0c0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
        <Border Name="Highlight"  CornerRadius="8" Background="Red"       HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
        <!-- snip actual visual stuff -->
        <Grid.Triggers>
            <EventTrigger RoutedEvent="Grid.Loaded">
                <EventTrigger.Actions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation x:Name="LoadedAnimation" 
                                             Storyboard.TargetName="Highlight" 
                                             Storyboard.TargetProperty="Opacity" 
                                             From="0" To="1" 
                                             RepeatBehavior="5x" 
                                             Duration="0:00:0.2" 
                                             AutoReverse="True" />
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger.Actions>
            </EventTrigger>
        </Grid.Triggers>
    </Grid>
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding Path=IsCritical}" Value="True">
            <Setter TargetName="LoadedAnimation" Property="RepeatBehavior" Value="5.5x" />
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

我们的想法是,在Highlight第一次加载项目时,EventTrigger会将边框的不透明度设置为0到1之间的动画,然后重复返回,从而吸引用户注意它.在DataTrigger确定的时间以动画的数目.如果视图模型报告该项目,IsCritical则动画发生5.5次(使其以不透明度1结束),否则发生5次(以不透明度0结束)

但是上面的XAML不起作用,因为DataTrigger的setter失败了:

在VisualTree中找不到名称为"LoadedAnimation"的子项.

很公平.因此,不喜欢使用自定义值转换器或将动画计数放在视图模型上并绑定到它,我有哪些选择?

vik*_*iky -4

尝试这样的事情:

<Style x:Key="EventTriggerStyleKey">
  <Style.Triggers>
    <EventTrigger RoutedEvent="some event here">
      <!-- your animation here -->
    </EventTrigger>
  <Style.Triggers>
</Style>

<Style x:Key="myStyleKey">
  <Style.Triggers>
    <DataTrigger Binding="....." Value="......">
      <Setter Property="........." Value="......."/>
      <Setter Property="Style" Value="{StaticResource EventTriggerStyleKey}"/>
    </DataTrigger>
  <Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)

  • 你试过这个吗?根据我的经验,你不可能有一种风格来设定一种风格。 (6认同)