2011-01-11 5 views
6

私のApplication.Resourcesに私は次のように定義しました:StoryboardコードビハインドでWP7 - Application.Resourcesで定義されているストーリーボードの使用

<Application.Resources> 
    <!--Storyboard animation for fading out a UI element--> 
    <Storyboard x:Key="FadeOutAnimation"> 
    <DoubleAnimation From="1" 
        To="0" 
        Duration="0:0:0.25" 
        Storyboard.TargetProperty="Opacity" 
        AutoReverse="False" /> 
    </Storyboard> 
</Application.Resources> 

私は、ユーザーがそれらをタップしたときに、いくつかのTextBlock Sをフェードアウトするためにこれを使用しています。

// Get the storyboard from application resources 
Storyboard sb = (Storyboard)App.Current.Resources["FadeOutAnimation"]; 
// Setup the animation target for fade out 
Storyboard.SetTarget(sb.Children.ElementAt(0) as DoubleAnimation, myTextBlock); 
// Set the animation completed handler 
sb.Completed += (s, e1) => { 
    // Stop the Storyboard 
    sb.Stop(); 
    // Hide the TextBlock 
    myTextBlock.Visibility = Visibility.Collapsed; 
}; 
// Start the Storyboard 
sb.begin(); 

質問です、私は何とかDoubleAnimationの対象であることからmyTextBlock「を外し」する必要がありますか?

「はい」の場合はどうすればよいですか?

私が尋ねる理由は、このストーリーボードが再び使用されるまで、TextBlockがぶら下がっていることを心配しています。

ありがとうございました!

答えて

12

我々は常にその我々の方法で取得した場合sliverlightでXAMLを使用する必要はありません。 - これにより

public static AnimationHelper 
    { 
     public static void FadeOutAndCollapse(UIElement target) 
     { 
      DoubleAnimation da = new DoubleAnimation(); 
      da.From = 1.0; 
      da.To = 0.0; 
      da.Duration = TimeSpan.FromSeconds(0.25); 
      da.AutoReverse = false; 

      StoryBoard.SetTargetProperty(da, new PropertyPath("Opacity")); 
      StoryBoard.SetTarget(da, target); 

      StoryBoard sb = new StoryBoard(); 
      sb.Children.Add(da); 

      EventHandler eh = null; 
      eh = (s, args) => 
      { 
       target.Visiblity = Visibility.Collapsed; 
       sb.Stop(); 
       sb.Completed -= eh; 
      } 
      sb.Completed += eh; 

      sb.Begin(); 
     } 
} 

場所にあなたが任意のUI要素をフェードアウトし、折りたたむことができます: -

AnimationHelper.FadeOutAndCollapse(myTextBox); 

より一般的なものにするために、From = 1.0を削除する傾向がありました。そのため、開始不透明度の低い要素が突然完全不透明になってから消えてしまうことはありません。

+0

そうです、コードビハインドでこれを行う方が良いです。 – Praetorian

+0

@Praetorian:すべてのコードが「コードビハインド」であるわけではありませんが、上記はそうではありません。このような便利なメソッドがいくつかあるヘルパークラスを想像することができます。それはちょうどあなた自身のツールキットの一部になります。 – AnthonyWJones

+0

ストーリーボードインスタンスを使用するためには何が必要ですか? – kabuto178

0

軽量のユーザーインターフェイス要素への参照がありません。それ以上の参照がないときにはガベージコレクションされます。より重大な問題は、複数のテキストオブジェクトに対して1つのストーリーボードが使用されていることです。重複すると、間違ったことが起こります。

たとえば、あるアニメーションを開始して別のアニメーションを開始すると、ストーリーボードが1つしかなく、ハンドラがstopを呼び出すため、同時に停止することになります。別のストーリーボードをXAMLの各テキスト要素に関連付けするか、実行する各アニメーションのコードビハインドで新しいストーリーボードを作成します。

また、1つのストーリーボードを使用する場合は、完成したイベントハンドラを慎重に削除する必要があります。ストーリーボードの再作成時に古いハンドラが呼び出されます。

+0

ストーリーボードはタップイベントによって起動されているため、1秒間だけ持続するので、複数のイベントが同時に発生する心配はありません。しかしCompletedハンドラについては良い点があります。最後のものを削除するにはどうしたらいいですか?私はラムダを使用しているので、私はそれを行う方法を知らない。 – Praetorian

関連する問題