プログラミングとかブログ

Unity/C#/SRPGStudio/RPGツクールMVの情報とかその他気になったことを調べて書きます。

【C#】【UWP】アニメーションができたりできなかったりする理由と解決方法

UWPアニメーションの区分概要

ストーリーボードに設定されたアニメーション (XAML) (Windows)
Windowsランタイムアプリ(UWP)でのアニメーションには依存型と独立型があります。
これは重いアニメーションを軽々しく使わせないためです。
処理を重くしそうなやつが依存型で、そうじゃないのが独立型です。

独立型は以下の種類のアニメーションになります。
・Durationが0秒
・アニメーション対象がUIElement.Opacity
・アニメーション対象がUIElementのプロパティ (RenderTransform、Projection、Clip) のサブプロパティ値
・アニメーション対象がCanvas.Left または Canvas.Top
・アニメーション対象がBrush 値であり、SolidColorBrush を使ってColorAnimationする
・アニメーションが ObjectAnimationUsingKeyFrames
それ以外は全部依存型と思っていいです。

なんでもできるようにするには

依存型の場合はそのままだとアニメーションできません。
xamlでアニメーションタグにEnableDependentAnimation="True"を設定します。
独立型の場合は必要ありません。
以下のコードではRectangleのHeightをアニメーションさせています。

//xaml
<Grid x:Name="grid" Background="{ThemeResource AppBarItemPressedForegroundThemeBrush}" >
        <StackPanel x:Name="LayoutRoot" Margin="515,138,-515,-138" >
            <StackPanel.Resources>
                <Storyboard x:Name="myStoryboard">
                    <DoubleAnimation From="10" To="200" Duration="0:0:1" AutoReverse="True"
                        Storyboard.TargetName="a" 
                        Storyboard.TargetProperty="Height"
                      ★EnableDependentAnimation="True" />
                </Storyboard>
            </StackPanel.Resources>
            <Rectangle x:Name="a" Fill="Blue" Width="100" Height="30" Margin="540,0" />
        </StackPanel>
            <Button x:Name="button1" Content="test" HorizontalAlignment="Left" VerticalAlignment="Top" Click="button1_Click" Margin="540,20"/>
</Grid>
//コードビハインド
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            myStoryboard.Begin();
        }

実行すると高さが変動します。
f:id:shirakamisauto:20160704232749g:plain

余談

厄介なのはUWPとそれ以前で仕様が変わっている点です。
アニメーション機構の基本や名称は変わってないので従来のサンプルコードがひっかかってしまいます。
そして動かない。わからない。もういいや。
最終的にフォーラムに質問投げて解消しましたが、2~3日苦しんでいました。
情報の見つけにくさはどうにかならないですかね・・・。