WPF 动画仅触发一次

标签 wpf datatrigger

我有一个小椭圆,每次依赖属性设置为 true 时我都希望它闪烁。因为该属性可以在几毫秒内很快从 true 变回 false,所以我需要使用动画而不是简单样式的数据触发器来完成此操作。基本上,我只想要真正的值来 ping 椭圆上的动画。

<Ellipse Height="10" Width="10" Stroke="#FFFFFFFF" Margin="5,3,0,0">
    <Ellipse.Fill>
        <SolidColorBrush />
    </Ellipse.Fill>
    <Ellipse.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsReceiving}" Value="True" >
                    <DataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="Fill.Color">
                                    <ColorAnimationUsingKeyFrames.KeyFrames>
                                        <DiscreteColorKeyFrame KeyTime="0:0:0" Value="Red"/>
                                        <DiscreteColorKeyFrame KeyTime="0:0:0.25" Value="Transparent"/>
                                    </ColorAnimationUsingKeyFrames.KeyFrames>
                                </ColorAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Ellipse.Style>
</Ellipse>

这个动画似乎有效,但它仅在值第一次达到 true 时触发。我错过了什么吗?

更新: 感谢大家的意见。事实证明,这是一个线程问题。最初,我在控件上有一个 DP,该控件绑定(bind)到实现 INotifyPropertyChanged 的​​ View 模型。然后我尝试删除控件上的 DP 并将我的 View 模型属性转换为 DP。繁荣,就在那时我开始收到一个错误,指出另一个线程拥有该对象。我意识到我需要使用响应式(Reactive)扩展来合并一些可观察对象,就像我在应用程序的其他部分所做的那样。我使用 PropertyChanged() 恢复到 View 模型传统属性,并将其简单地绑定(bind)到控件的动画。现在一切都完美无缺。

最佳答案

我遇到了类似的问题,当 DP 更改时,我会触发“输入”和“输出”动画。第一个周期运行良好,但此后什么也没发生。我通过在 BeginStoryboard 操作之前添加 RemoveStoryboard EnterActions 解决了这个问题。

<Border Name="Zyzzyx" Grid.Row="1" Background="DarkRed" Height="0" VerticalAlignment="Bottom">
    <Border.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=SelectionState, ElementName=ControlRoot, Mode=OneWay}" Value="Selecting">
                    <DataTrigger.EnterActions>
                        <RemoveStoryboard BeginStoryboardName="AnimateIn" />
                        <RemoveStoryboard BeginStoryboardName="AnimateOut" />
                        <BeginStoryboard Name="AnimateIn" HandoffBehavior="SnapshotAndReplace">
                            <Storyboard FillBehavior="HoldEnd" Duration="0:0:5">
                                <DoubleAnimation To="30" Duration="0:0:5" Storyboard.TargetProperty="Height" />
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=SelectionState, ElementName=ControlRoot, Mode=OneWay}" Value="Deselecting">
                    <DataTrigger.EnterActions>
                        <RemoveStoryboard BeginStoryboardName="AnimateIn" />
                        <RemoveStoryboard BeginStoryboardName="AnimateOut" />
                        <BeginStoryboard Name="AnimateOut" HandoffBehavior="SnapshotAndReplace">
                            <Storyboard FillBehavior="HoldEnd" Duration="0:0:5">
                                <DoubleAnimation To="0" Duration="0:0:5" Storyboard.TargetProperty="Height" />
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Border.Style>

<!-- Border content -->

</Border>

关于WPF 动画仅触发一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11945084/

相关文章:

c# - 在 Windows 窗体中创建类似 UI 的控制台

c# - 在运行时将 TypeConverter 属性添加到枚举

c# - Datatrigger 绑定(bind)到 ControlTemplate 和 ContentPresenter 中样式 TargetType 的属性

WPF 从 DataTrigger 设置 Image.Source

wpf - 我的数据触发绑定(bind)有什么问题?

c# - 如何从 RichTextBox 控件的撤消堆栈中删除操作?

c# - 为什么 OpenFileDialog 需要 Microsoft.Win32?

c# - 如何通过 WPF DataTrigger 在多值转换器中传递多个参数

sql-server - SQL Server 触发器对表进行插入、删除和更新

c# - WPF Grid.IsSharedSizeScope 跨多个网格