私はWindowsPhoneアプリに取り組んでいますが、これは同様に当てはまると思いますSilverlight
。'プロパティを透明から赤にStoryboard
変更してから透明に戻す(現在、テスト用の分離コードページでグローバル変数として作成しています)を作成したいと思います。これを複数の長方形の間で再利用するので、コードビハインドからアクセスできるようにしたいと思います。このような例は見つからなかったので、うまくいくと思うものを試してみました。Rectangle
Fill
Storyboard
Begin()
初期設定:
sb = new Storyboard();
turnOn= new ColorAnimation();
turnOn.From = Colors.Transparent;
turnOn.To = Colors.Red;
turnOn.Duration = new TimeSpan(0, 0, 0, 0, 500); //half second
turnOff= new ColorAnimation();
turnOff.From = Colors.Red;
turnOff.To = Colors.Transparent;
turnOff.Duration = new TimeSpan(0, 0, 0, 0, 500); //half second
Storyboard.SetTargetProperty(turnOn, new PropertyPath("(Rectangle.Fill)"));
Storyboard.SetTargetProperty(turnOff, new PropertyPath("(Rectangle.Fill)"));
sb.Children.Add(turnOn);
sb.Children.Add(turnOff);
canvas.Resources.Add("sb", sb); // this is the canvas where the rectangles will be
次に、いつでも、Rectangle
上から上にあるインスタンスがある場合Canvas
は、ストーリーボードを開始したいと思います。これにより、Rectangle
赤に変わり、透明に戻ります。
// Set the target to my current rectangle, and begin:
Storyboard.SetTarget(turnOn, myRectangle);
Storyboard.SetTarget(turnOn, myRectangle);
sb.Begin();
ただし、次の例外がsb.Begin()
行にスローされます。
InvalidOperationExceptionはユーザーコードによって処理されませんでしたタイプ'System.InvalidOperationException'の例外がSystem.Windows.ni.dllで発生しましたが、ユーザーコードでは処理されませんでした
私の考えでは、ここからそれほど遠くないことを望んでいますが、もっと簡単な方法があるのではないでしょうか。そうでない場合、誰かが私が間違っていることを見ることができますか?
更新(解決策):
@Josh Mackeyが提供した例に従い、とにかくきれいになると思うページに移動Storyboard
しました。XAML
以前気づかなかったのは、「互換性のないタイプのため、ColorAnimationを使用してプロパティFillをアニメーション化することはできません」という例外の詳細でした。に変更することで、@JoshMackeyのソリューションを使用できましColorAnimation
たColorAnimationUsingKeyFrames
。新しいコード:
<Canvas.Resources>
<Storyboard x:Name="sb">
<ColorAnimationUsingKeyFrames
Storyboard.TargetProperty="(Rectangle.Fill).(SolidColorBrush.Color)"
AutoReverse="True">
<EasingColorKeyFrame KeyTime="00:00:0" Value="Black" />
<EasingColorKeyFrame KeyTime="00:00:0.25" Value="Red" />
</ColorAnimationUsingKeyFrames>
</Storyboard>
</Canvas.Resources>
に設定できたため、1つのアニメーションしか使用できませんでしたAutoReverse
。True
この記事Storyboard
では、コード内でにアクセスする方法を説明しています。次のようになります。
sb.Stop();
sb.SetValue(Storyboard.TargetNameProperty, myRectangle.Name);
sb.Begin();
そして今、それは期待通りに動作します!