10

Storyboardクラスを使用してコードからアニメーションを作成しようとしています。厚さアニメーションクラスはありません。また、Blendを使用してストーリーボードを作成しようとしましたが、そこでは機能しません。新しい値に直接ジャンプするだけで、スムーズなアニメーションはありません。

更新:TranslateXトランスフォームを使用してみました。しかし、画像に使用すると、画像がクリップされます。私がやろうとしているのは、小さなグリッド内で非常に遅い大きな画像をアニメーション化することです。そのため、この効果があります(ZuneおよびWindows Phoneギャラリー内の画像と同様)。画像が開いたら、アニメーションを開始します。これが私のコードです。

private void Image_ImageOpened_1(object sender, RoutedEventArgs e)
    {
        var img = sender as Image;

        Storyboard sb = new Storyboard();
        var doubleAnimationx = new DoubleAnimation() { To = -100, SpeedRatio = 0.1, From = 0 };
        Storyboard.SetTarget(doubleAnimationx, img);
        Storyboard.SetTargetProperty(doubleAnimationx, "(UIElement.RenderTransform).(CompositeTransform.TranslateX)");
        sb.Children.Add(doubleAnimationx);
        sb.Begin();
    }

Xaml:

<Grid  IsSwipeEnabled="True" ItemsSource="{Binding Source={StaticResource cvs1}}" ItemClick="ItemsGridView_ItemClick_1"
                            x:Name="ItemsGridView" Margin="50,20,116,46" SelectionMode="None" IsItemClickEnabled="True"
                            AutomationProperties.AutomationId="ItemsGridView" 
                            AutomationProperties.Name="Grouped Items">
                <Grid.ItemTemplate>
                    <DataTemplate>
                        <Grid Height="250" VariableSizedWrapGrid.ColumnSpan="{Binding ColumnSpan}" Margin="2">
                            <Image ImageOpened="Image_ImageOpened_1" Stretch="UniformToFill" Source="{Binding ImageHQ}" >
                                <Image.RenderTransform>
                                    <CompositeTransform />
                                </Image.RenderTransform>
                            </Image>
                            <StackPanel VerticalAlignment="Bottom" Background="#AA000000">
                                <TextBlock Margin="5,5,5,0" FontSize="26" Text="{Binding Name,Mode=OneWay}" FontFamily="Arial Black" />
                                <TextBlock Margin="5,0,5,5" FontSize="24" Text="{Binding Section,Mode=OneWay}" Foreground="{Binding SectionColor,Mode=OneWay}" />
                            </StackPanel>
                        </Grid>
                    </DataTemplate>
                </Grid.ItemTemplate>
</Grid>
4

2 に答える 2

21

まず、余白をアニメーション化することはお勧めできません (ツリー全体を更新する必要があります)。どのような効果を達成したいですか?オブジェクトを移動しますか? はいの場合は、DoubleAnimation を使用して TranslateTransform を変更します。

Windows 8 でこれを行ったことはありませんが、WPF とほぼ同じだと思います。XAML でアニメーションを定義するのが最善です

<Window.Resources>

    <Storyboard  x:Key="mainInAnimation">
        <DoubleAnimation Storyboard.TargetName="panelTrans" 
                                Storyboard.TargetProperty="X"
                                BeginTime="0:0:0.2"
                                Duration="0:0:0.3" To="0" >
            <DoubleAnimation.EasingFunction>
                <ExponentialEase  EasingMode="EaseOut"  />
            </DoubleAnimation.EasingFunction>
        </DoubleAnimation>
    </Storyboard>

次に、パネルへのレンダリング変換が必要です

    <StackPanel Name="leftPanel"  ... >
        <StackPanel.RenderTransform>
            <TranslateTransform x:Name="panelTrans" X="-10"></TranslateTransform>
        </StackPanel.RenderTransform>

コードでアニメーションを開始するには (私はこの方法を好みます)

        Storyboard anim = (Storyboard)this.Resources["mainInAnimation"];
        anim.Begin();
于 2012-05-08T16:16:14.527 に答える
9

私は今日、まったく同じ問題に直面しました。それを修正するために、私は次のことをしました:

私のストーリーボードは、最初にマージンを希望どおりにリセットし、TranslateTransformを反対に設定することでそれに対抗します。これには効果がないという効果がありますが、TranslateTransformでアニメーションを実現でき、画像が表示されます。

<Storyboard x:Name="rotateViews">
    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Margin)" Storyboard.TargetName="root">
        <DiscreteObjectKeyFrame KeyTime="0">
            <DiscreteObjectKeyFrame.Value>
                <Thickness>0,-100,0,0</Thickness>
            </DiscreteObjectKeyFrame.Value>
        </DiscreteObjectKeyFrame>
    </ObjectAnimationUsingKeyFrames>
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" Storyboard.TargetName="root">
        <EasingDoubleKeyFrame KeyTime="0" Value="100"/>
        <EasingDoubleKeyFrame KeyTime="0:0:0.7" Value="0">
            <EasingDoubleKeyFrame.EasingFunction>
                <CubicEase EasingMode="EaseInOut"/>
            </EasingDoubleKeyFrame.EasingFunction>
        </EasingDoubleKeyFrame>
    </DoubleAnimationUsingKeyFrames>
</Storyboard>
于 2013-03-18T12:39:06.917 に答える