.net - 如何结合 DataTrigger 和 EventTrigger?

标签 .net wpf xaml triggers datatrigger

NOTE I have asked the related question (with an accepted answer): How to combine DataTrigger and Trigger?



我想我需要结合一个 EventTriggerDataTrigger实现我所追求的:
  • 当一个项目出现在我的 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>
    

    这个想法是 EventTrigger 为 Highlight 设置动画。边框的不透明度在 0 和 1 之间,并在第一次加载项目时重复返回,从而引起用户的注意。 DataTrigger确定动画的次数。如果 View 模型报告项目 IsCritical然后动画发生 5.5 次(以不透明度 1 结束),否则动画发生 5 次(以不透明度 0 结束。)

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

    Child with Name 'LoadedAnimation' not found in VisualTree.



    很公平。因此,对于使用自定义值转换器或将动画计数放在 View 模型上并绑定(bind)到它,我有什么选择?

    最佳答案

    在这种情况下,我会使用行为而不是触发器。您可以编写一个行为,将事件处理程序附加到关联对象的加载事件,然后应用动画。该行为可能会公开一些属性,我会公开一个 AnimationCount (int) 属性,该属性告诉行为在与其关联的元素上重复动画多少次。然后,您可以将此属性绑定(bind)到 View 模型中的 IsCritical 属性,并使用值转换器将 false 转换为 5,将 true 转换为 5.5

    希望这可以帮助

    关于.net - 如何结合 DataTrigger 和 EventTrigger?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1679391/

    相关文章:

    c# - 真正的模态窗口可能吗?

    c# - WP增加全景重叠

    .net - 如何检测安装了哪些.NET Framework版本和Service Pack?

    c# - 如何比较类型

    c# - HTTP POST 返回错误 : 417 "Expectation Failed."

    c# - C#简单多线程

    c# - 在 WPF Slider 中,拇指没有立即用 wacom 板拖动

    具有自定义下拉宽度的 WPF ComboBox

    c# - 等到进程结束

    c# - 切片图像wpf