2011-01-11 7 views
6

Application.Resources içinde Storyboard tanımlanmış var. GelenWP7 - Application.Resources içinde tanımlanan Storyboard'u Kullanma

<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> 

kod arkada ben kullanıcı üzerlerinde dokunduğunda bazı TextBlock s karartmak için bu kullanıyorum.

// 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(); 

soru, ben DoubleAnimation hedef olmaktan her nasılsa 'Unhook' myTextBlock gerekiyor?

Evet, nasıl yaparım?

Sorduğumun nedeni, bu Storyboard yeniden kullanılıncaya kadar etrafta asılı olan TextBlock referansından endişeliyim.

Yardımlarınız için teşekkürler!

cevap

12

: - Bununla

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(); 
     } 
} 

yerde sen fade out ve herhangi UI öğesi daraltmak: -

AnimationHelper.FadeOutAndCollapse(myTextBox); 

From = 1.0'u daha genel hale getirmek için eğimliydim, böylece daha düşük başlangıç ​​opaklığına sahip olan öğeler kaybolmadan önce aniden tam opaklığa kadar yanıp sönmezler.

+0

Haklısınız, bunu kod arkasında yapmak daha iyidir. – Praetorian

+0

@Praetorian: Tüm kodlar "kod arkası" değil, yukarıdakiler değil. Bir dizi faydalı yöntemle bir yardımcı sınıf hayal edebilirsiniz. Sadece kendi araç takımınızın bir parçası haline geliyor. – AnthonyWJones

+0

Film şeridi örneğini kullanabilmek için neye ihtiyaç var? – kabuto178

0

Hafif kullanıcı arabirim öğeleriyle ilgili başvuruları sarkıtma konusunda endişelenmeyin; Daha fazla referans olmadığında çöp toplanacaklar. Daha acil sorunlarınız, birden fazla metin nesnesi için tek bir hikaye tahtasının kullanılmakta olması ve çakışmaları durumunda yanlış bir şey yapmasıdır.

Örneğin, bir animasyonu başlatır ve ardından başka birini başlatırsanız, o zaman ikisi de aynı anda duracaktır, çünkü yalnızca bir storyboard vardır ve işleyici çağrılarınız durur. XAML'deki her bir metin öğesiyle ayrı bir storyboard ilişkilendirin ya da yapmak istediğiniz her animasyon için arka planda yeni bir storyboard oluşturun.

Ayrıca, tek bir storyboard kullanacak olsaydınız, tamamlanmış olay işleyicisini kaldırmaya dikkat etmelisiniz çünkü şu anda bunları biriktirmeye devam edeceksiniz ve storyboard yeniden tamamlandığında eski işleyiciler çağrılacaksınız.

Biz her zaman onun bizim engel olmadığını sliverlight içinde Xaml kullanmak gerekmez
+0

Storyboard, bir dokunma olayıyla başlatıldığından ve sadece saniyenin çeyreği kadar sürdüğü için, birden fazla kişi için aynı anda ateş etmekten çok endişelenmiyorum. Ama Tamamlanmış işleyici hakkında iyi bir nokta var. Sonuncusu nasıl kaldırabilirim? Bir lambda kullanıyorum çünkü nasıl yapacağımı bilmiyorum. – Praetorian