前提・実現したいこと
RotateTransform を複数のコントロールで共有することでメモリを節約しつつ同じ角度で回転アニメーションさせたいです。(下のGIF画像参照)
このようなコントロールが200個ほどあるので、コントロールごとに RotateTransform のインスタンスを生成するのは避けたいです。
そのため、RotateTransform を Resources にしておいて、共有しようと思いました。
発生している問題
方法: 要素のスピンを設定する のコードの RotateTransform を Resources に移動して、StaticResourceExtension で参照するようにした所、回転しなくなりました。
XAML
<Window ...> <Window.Resources> <RotateTransform x:Key="MyAnimatedTransform" Angle="0" /> </Window.Resources> <StackPanel Margin="50"> <Button RenderTransformOrigin="0.5,0.5" HorizontalAlignment="Left" RenderTransform="{StaticResource MyAnimatedTransform}"> Hello,World <Button.Triggers> <EventTrigger RoutedEvent="Button.Click"> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.Target="{StaticResource MyAnimatedTransform}" Storyboard.TargetProperty="(RotateTransform.Angle)" From="0.0" To="360" Duration="0:0:1" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Button.Triggers> </Button> </StackPanel> </Window>
質問
- なぜ上記のプログラムで Button が回転しないのか分かりません。
- 複数のコントロールの RenderTransform プロパティの値を、単一の RotateTransform のインスタンスに設定し、かつ同じ回転アニメーションをさせるにはどうすれば良いですか。
環境
- WPF
- .NET Core 3.1
- Visual Studio 2019
- Windows 10
追記
リソースに、ダミーのオブジェクトを置いて、そのプロパティ経由でアニメーションさせると、動作しました。
DependencyObject のプロパティ経由じゃないとアニメーション出来ない仕様なんでしょうか……。
XAML
<Window ...> <Window.Resources> <RotateTransform x:Key="MyAnimatedTransform" Angle="0" /> <UIElement x:Key="MyAnimatedTransformHolder" RenderTransform="{StaticResource MyAnimatedTransform}" /> </Window.Resources> <StackPanel Margin="50"> <Button HorizontalAlignment=" Left"> Hello,World <Button.Triggers> <EventTrigger RoutedEvent="Button.Click"> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.Target="{StaticResource MyAnimatedTransformHolder}" Storyboard.TargetProperty="RenderTransform.(RotateTransform.Angle)" From="0.0" To="360" Duration="0:0:1" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Button.Triggers> </Button> <Rectangle Fill="Red" RenderTransformOrigin="0.5,0.5" Width="100" Height="200" RenderTransform="{StaticResource MyAnimatedTransform}" /> </StackPanel> </Window>
まだ回答がついていません
会員登録して回答してみよう