WPF动画只有一次射击(WPF Animation Only Firing Once)

2019-09-21 04:27发布

我有,我想每一个闪光的依赖属性被设置为true时间的一小椭圆。 由于该属性可以非常迅速地从真回假以毫秒为单位的事去了,我需要一个动画,而不是一个简单的风格datatrigger做到这一点。 基本上,我只是想真实价值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>

这个动画似乎工作,但它只触发第一次值达到真实。 我缺少的东西吗?

更新:感谢您的输入大家。 事实证明,这是一个线程问题。 本来,我对那个被绑定到实现INotifyPropertyChanged的视图模型控制一个DP。 然后我试图在控制取出DP和把我的视图模型属性为DP。 热潮,那个时候我开始的错误,指出不同的线程拥有的对象。 我意识到我需要纳入使用无扩展,因为我在应用程序的其他部分做了一些观测量。 我恢复到视图模型传统的财产用的PropertyChanged()和简单的约束,要控制的动画。 现在一切工作完美。

Answer 1:

我有一个类似的问题,我有一个“中”和“出”的动画时,DP改为被解雇。 第一个周期的工作很好,但没有什么发生后。 我加入解决它RemoveStoryboard的前EnterActions BeginStoryboard行动。

<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>


Answer 2:

 <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,Mode=TwoWay}" 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>

尝试使用模式=双向



Answer 3:

我也看到了类似的问题来解决我的问题,我发现我已经在DataTrigger的ExitActions添加StopStoryboard标签。



Answer 4:

                <DataTrigger.EnterActions>
                    <RemoveStoryboard BeginStoryboardName="AnimateIn" />
                    <RemoveStoryboard BeginStoryboardName="AnimateOut" />
                    <BeginStoryboard ...>
                </DataTrigger.EnterActions>

工作,但我认为这是更好地使用

                <DataTrigger.EnterActions>
                    <BeginStoryboard Name="FadeIn"...>
                </DataTrigger.EnterActions>
                <DataTrigger.ExitActions>
                    <RemoveStoryboard BeginStoryboardName="FadeIn" />
                </DataTrigger.ExitActions>


Answer 5:

你需要提供定义为IsReceiving属性是肯定的。 基于真假之间切换,你有一个属性(IsReceiving)的假设,这将触发这个动画效果:如果你只看到触发一次,则效果:

1)检查属性是一个DependencyProperty或使用INotifyPropertyChanged的正确信号更新视图。
2)检查属性setter实际上是从true更改为False和背部。



Answer 6:

我无法重现你的问题。 这里是我的代码隐藏:

public partial class MainWindow : Window
{
    public static readonly DependencyProperty IsReceivingProperty =
        DependencyProperty.Register("IsReceiving",
                                    typeof(bool), typeof(MainWindow));

    public bool IsReceiving
    {
        get { return (bool)GetValue(IsReceivingProperty); }
        set { SetValue(IsReceivingProperty, value); }
    }

    public MainWindow()
    {
        InitializeComponent();

        myEllipse.DataContext = this;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        this.IsReceiving = true;
        this.IsReceiving = false;
    }
}


文章来源: WPF Animation Only Firing Once