在Windows 8中重复使用动画

3

我正在开发Windows商店应用程序(Winrt、Metro、Windows 8应用程序)。我尝试在网格视图动态展示图片:当图片从网络加载并打开后,它将填充其单元格。

为此,我有一个故事板:

            <Storyboard x:Name="PopupImageStoryboard">
                <DoubleAnimationUsingKeyFrames EnableDependentAnimation="True" Storyboard.TargetProperty="(FrameworkElement.Width)" Storyboard.TargetName="image">
                    <EasingDoubleKeyFrame KeyTime="0" Value="100"/>
                    <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="240"/>
                </DoubleAnimationUsingKeyFrames>
                <DoubleAnimationUsingKeyFrames EnableDependentAnimation="True" Storyboard.TargetProperty="(FrameworkElement.Height)" Storyboard.TargetName="image">
                    <EasingDoubleKeyFrame KeyTime="0" Value="100"/>
                    <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="240"/>
                </DoubleAnimationUsingKeyFrames>
            </Storyboard>

我有以下C#代码来处理图像加载和打开的事件:

    private void Image_ImageOpened(object sender, RoutedEventArgs e)
    {
        Storyboard.SetTarget(PopupImageStoryboard, sender as Image);
        PopupImageStoryboard.Begin();
    }

它不起作用,我无法在其运行时更改目标并重新运行相同的故事板。但是我想让多个图像同时运行此动画。您能推荐任何动画重用的解决方案吗?

1个回答

4

您需要从每个子动画中删除此项:

Storyboard.TargetName="image"

我认为一个单独的Storyboard可能无法同时用于两个目标元素,因此解决方法是将其放入DataTemplate中。

<Page.Resources>
    <DataTemplate
        x:Name="myStoryboard">
        <Storyboard ... />
    </DataTemplate>
</Page.Resources>

然后在代码中你可以这样说:

var sb = (Storyboard)myStoryboard.LoadContent();
Storyboard.SetTarget(sb, sender as Image);
sb.Begin();

顺便提一下 - 不要对宽度和高度属性进行动画处理。在您的情况下,这几乎肯定不是最佳方法。相反,您应该动画化RenderTransform属性,例如以ScaleTransform的ScaleX和ScaleY属性为目标。如果动画是依赖项,则会导致每帧中的布局更新,这非常低效并会降低动画帧率。

*编辑

更好的解决方案应该是这样的:

<Page.Resources>
    <DataTemplate
        x:Name="myStoryboardTemplate">
        <Storyboard>
            <DoubleAnimation
                Storyboard.TargetProperty="ScaleX"
                From="0.5"
                To="1.0"
                Duration="0:0:0.4">
                <DoubleAnimation.EasingFunction>
                    <BackEase
                        Amplitude="2"
                        EasingMode="EaseOut"/>
                </DoubleAnimation.EasingFunction>
            </DoubleAnimation>
            <DoubleAnimation
                Storyboard.TargetProperty="ScaleY"
                From="0.5"
                To="1.0"
                Duration="0:0:0.4">
                <DoubleAnimation.EasingFunction>
                    <BackEase
                        Amplitude="2"
                        EasingMode="EaseOut" />
                </DoubleAnimation.EasingFunction>
            </DoubleAnimation>
        </Storyboard>
    </DataTemplate>
</Page.Resources>

...

<Image
    HorizontalAlignment="Center"
    VerticalAlignment="Center"
    Width="620"
    Height="300"
    Source="Assets/SplashScreen.png"
    RenderTransformOrigin="0.5,0.5"
    Stretch="Fill">
    <Image.RenderTransform>
        <ScaleTransform
            x:Name="imageScaleTransform" />
    </Image.RenderTransform>
</Image>

...

void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    var sb = (Storyboard)myStoryboardTemplate.LoadContent();
    Storyboard.SetTarget(sb, imageScaleTransform);
    sb.Begin();
}

谢谢您的回答!您能否提供有关“弹出”图片的替代动画方法的更多细节?我明白动画宽度和高度不是最好的选择。 - imslavko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接