複数の場所で同じストーリーボードを使用する必要があるため、ストーリーボードを Application.Resources 内に配置しました。ストーリーボードを実行しようとすると、アニメーション化するターゲットを参照する必要があるという唯一の問題があります。これが私のストーリーボードです:
<System:String x:Key="target">border2</System:String>
<Storyboard x:Key="stHeight">
<DoubleAnimationUsingKeyFrames
Storyboard.TargetProperty="(FrameworkElement.Height)"
Storyboard.TargetName="{DynamicResource target}">
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="90">
<EasingDoubleKeyFrame.EasingFunction>
<CircleEase EasingMode="EaseOut"/>
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
別のオブジェクトの高さをアニメーション化する方法は、動的リソース ターゲットを変更することです。ストーリーボードが現在のウィンドウにあるときに、そうすることができました。しかし、アプリケーション リソースに配置したいので、ターゲット プロパティを参照する方法がわかりません。
編集
以前に投稿したソリューションはうまく機能しますが、コードで複雑なアニメーションを作成するのが難しい場合があります。私が考え出した別の解決策は、表現のブレンドを使用して絵コンテを作成することでした。そのため、エクスプレッション ブレンドのメイン ウィンドウにランダム コントロールをドラッグし、ランダム アニメーションを作成します。アニメーションが次のようになるとしましょう:
<Storyboard x:Key="Storyboard1">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="grid">
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="90"/>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)" Storyboard.TargetName="grid">
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="103"/>
</DoubleAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransformOrigin)" Storyboard.TargetName="grid">
<EasingPointKeyFrame KeyTime="0:0:1" Value="0.75,0.5"/>
</PointAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)" Storyboard.TargetName="grid">
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="75"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
次に、そのコードをコピーして、APP.XAML ではなく作業ウィンドウに貼り付けます。
そして、私のコードで私が持っているとしましょう:
<Border Name="brdBorder" BorderBrush="Silver" BorderThickness="1" Margin="328,104,0,0" Background="#FFE52E2E" HorizontalAlignment="Left" Width="94" Height="100" VerticalAlignment="Top" >
<Border.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform/>
<TranslateTransform/>
</TransformGroup>
</Border.RenderTransform>
</Border>
何らかの理由で、オブジェクトをアニメートするために変換グループが存在する必要があります。とにかく、作業ウィンドウにそのボーダーがあり、エクスプレッション ブレンドで作成したのと同じアニメーションでアニメーション化したいとしましょう。コードで行うことは次のとおりです。
Storyboard sb1 = FindResource("Storyboard1") as Storyboard;
foreach (var child in sb1.Children)
{
Storyboard.SetTargetName(child, brdBorder.Name);
}
sb1.Begin(this);
そして、作業ウィンドウでその境界線をアニメーション化できます。これの良いところは、同じアニメーションを複数のオブジェクトに適用できることです (これがリソースを作成する目的だと思います)。ストーリーボードをリソース ディクショナリまたは app.xaml に配置しようとすると問題が発生します。ファイル。これを行うと、c# はストーリーボードを見つけることができますが、ストーリーボードのプロパティは読み取り専用であるため、エラーが発生します。
Cannot set a property on object 'System.Windows.Media.Animation.DoubleAnimationUsingKeyFrames' because it is in a read-only state.
これをやりたかった理由は、同じアニメーションを複数のオブジェクトに適用するためです。回避策は、基本的なアニメーションをコードで作成し、イージング関数などのより複雑なアニメーションをリソースとして保存することでした。私の言いたいことをお見せしましょう。
リソース ファイルに、次のリソースを配置しました。
<EasingDoubleKeyFrame x:Key="pleaseWork">
<EasingDoubleKeyFrame.EasingFunction >
<BackEase EasingMode="EaseOut" Amplitude="1"/>
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
エクスプレッション ブレンドでは、より複雑なイーズ関数を構築できます。次に、コード ビハインドを使用して、基本的なストーリーボードを作成します。
DoubleAnimation animation = new DoubleAnimation();
animation.To = 336; // final value
//animation.From = 0;
//animation.BeginTime = TimeSpan.FromSeconds(0);
animation.Duration = new Duration(TimeSpan.FromSeconds(5)); // how much time should animation last
// here comes the magic:
// note that I can bind to EasingDoubleKeyFrame in my resource file in xaml
animation.EasingFunction = ((EasingDoubleKeyFrame)FindResource("pleaseWork")).EasingFunction; // apply the easing function
Storyboard.SetTarget(animation, groupBox1); // what object will be animated?
Storyboard.SetTargetProperty(animation, new PropertyPath(FrameworkElement.HeightProperty)); // what property will be animated
Storyboard sb = new Storyboard();
sb.Children.Add(animation);
sb.Begin();
これにより、複数のオブジェクトで同じストーリーボードを使用できるようになりました。