在WPF中,有没有办法在后面的代码中获取故事板动画值的当前值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在WPF中,有没有办法在后面的代码中获取故事板动画值的当前值?相关的知识,希望对你有一定的参考价值。

我把故事板动画定义为资源。我使用 StoryBoard.Begin 方法中获取故事板动画(双动画)的当前值。我想在后面的代码中获取故事板动画(双动画)的当前值,我试过使用Changed事件,但似乎没有意义,如何在后面的代码中获取双动画的插值、当前值?

我想要的和这个问题中类似。获取双动画的当前值

这是启动动画的代码。

 protected override void OnMouseEnter(MouseEventArgs e)
        {
            speedLine = Template.FindName(speedLineName, this) as Line;
            var std = speedLine.Resources["std"] as Storyboard;
            var doubleAnim = std.Children[0] as DoubleAnimation;
            doubleAnim.From = 220;
            doubleAnim.Changed += DoubleAnim_Changed;
            doubleAnim.To = MaxSpeed;
            std.Begin();
            base.OnMouseEnter(e);
        }

这是相关的XAML文件

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:Speedometar}">
                <Grid Background="{TemplateBinding Background}" x:Name="RootGrid">
                    <Ellipse  x:Name="PART_OuterElipse"  Fill="LightGray" Width="220" Height="220" />
                    <Ellipse   Fill="Gray" Width="200"  Height="200" />
                    <Line x:Name="PART_SpeedLine" Stroke="Red" Width="200" StrokeThickness="2" Panel.ZIndex="1" X1="100" Y1="10" X2="100" Y2="100">
                        <Line.RenderTransform>
                            <RotateTransform Angle="220" CenterX="100" CenterY="100" />
                        </Line.RenderTransform>
                        <Line.Resources>
                            <Storyboard  x:Key="std">

                                <DoubleAnimation 
                                        Storyboard.TargetName="PART_SpeedLine"
                                        Storyboard.TargetProperty="(Line.RenderTransform).(RotateTransform.Angle)"
                                        Duration="0:0:1"
                                        To="{StaticResource AngleResource}">
                                    <DoubleAnimation.EasingFunction >
                                        <CircleEase></CircleEase>
                                    </DoubleAnimation.EasingFunction>
                                </DoubleAnimation>
                            </Storyboard>
                        </Line.Resources>
                    </Line>


                </Grid>

            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
答案

你可以通过使用以下方法获取正在播放动画的依赖属性的当前值 DependencyPropertyDescriptor:

RotateTransform rotateTransform = speedLine.RenderTransform as RotateTransform;
DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor
    .FromProperty(RotateTransform.AngleProperty, typeof(RotateTransform));
if (dpd != null)
{
    dpd.AddValueChanged(rotateTransform, new EventHandler((ss, ee) => 
    {
        Debug.WriteLine("Current value is " + rotateTransform.Angle.ToString());
    }));
}

以上是关于在WPF中,有没有办法在后面的代码中获取故事板动画值的当前值?的主要内容,如果未能解决你的问题,请参考以下文章

故事板动画没有动画

隐藏受影响的控件时,WPF 故事板动画是不是继续运行?

WPF 从代码触发动画

向“切换”发送垃圾邮件时,C#/WPF 处理活动的故事板动画

如何为 WPF 故事板中的静态对象设置动画

动画故事板没有触发器