2010-05-15 15 views
13

Üzerinde dinamik olarak koddan nesne oluşturduğum bir WPF tuvalim var. Bu nesneler RenderTransform özelliği ayarlanarak dönüştürülür ve bir animasyonun bu dönüşümlerden biri uygulanması gerekir. Şu anda, herhangi bir dönüşümün animasyonunu yapamıyorum (istisna oluşmaz ve animasyon çalışacak gibi görünür - tamamlanmış etkinlik artırılır). Ayrıca, animasyon sistemi geriliyorsa, bazen Storyboard.Completed olayı asla yükseltilmez.WPF: WordTransform'u dönüştürmek Çevirme kodu

Karşılaştığım tüm örnekler, XAML'deki dönüşümleri canlandırıyor. MSDN documentation, bir dönüştürmenin x: Name özelliğinin, bu parametrenin animatabl olması için ayarlanması gerektiğini önerir, ancak bunu koddan ayarlamak için bir çalışma yolu bulamadım.

Herhangi bir fikrin var mı?

Burada sorun reproduces tam kod listesi verilmiştir:

using System; 
using System.Diagnostics; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 

namespace AnimationCompletedTest { 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window { 

     Canvas panel; 
     public MainWindow() { 
      InitializeComponent(); 
      MouseDown += DoDynamicAnimation; 

      Content = panel = new Canvas(); 
     } 

     void DoDynamicAnimation(object sender, MouseButtonEventArgs args) { 

      for (int i = 0; i < 12; ++i) { 
       var e = new Ellipse { 
        Width = 16, 
        Height = 16, 
        Fill = SystemColors.HighlightBrush 
       }; 
       Canvas.SetLeft(e, Mouse.GetPosition(this).X); 
       Canvas.SetTop(e, Mouse.GetPosition(this).Y); 

       var tg = new TransformGroup(); 
       var translation = new TranslateTransform(30, 0); 
       tg.Children.Add(translation); 
       tg.Children.Add(new RotateTransform(i * 30)); 
       e.RenderTransform = tg; 

       panel.Children.Add(e); 

       var s = new Storyboard(); 
       Storyboard.SetTarget(s, translation); 
       Storyboard.SetTargetProperty(s, new PropertyPath(TranslateTransform.XProperty)); 

       s.Children.Add(
        new DoubleAnimation(3, 100, new Duration(new TimeSpan(0, 0, 0, 1, 0))) { 
         EasingFunction = new PowerEase {EasingMode = EasingMode.EaseOut} 
        }); 

       s.Completed += 
        (sndr, evtArgs) => { 
         Debug.WriteLine("Animation {0} completed {1}", s.GetHashCode(), Stopwatch.GetTimestamp()); 
         panel.Children.Remove(e); 
        }; 

       Debug.WriteLine("Animation {0} started {1}", s.GetHashCode(), Stopwatch.GetTimestamp()); 

       s.Begin(); 
      } 
     } 

     [STAThread] 
     public static void Main() { 
      var app = new Application(); 
      app.Run(new MainWindow()); 
     } 
    } 
} 

cevap

12

görünüyor o Googling biraz ben sorunu kendim çözüldü sonra. MSDN documentation ve a post in MSDN forums by Antares19'a çok teşekkürler. Özetle

: Bir Film Şeridi 'tarafından hedeflenebilir olması (TranslateTransform gibi) Freezable nesnesi için

  • , bir tescilli adı olmalıdır. Bu, FrameworkElement.RegisterName (..) çağrılarak yapılabilir.

  • Storyboard nesnesini, TranslateTransformu kaydettirdiğim aynı Framework öğesinin ResourceDictionary öğesine ekledim. Bu

    İşte

şimdi güzel animasyon güncellenen kod, ve kayıtları/kaydını kaldırır eklenen kaynaklar ResourceDictionary.Add (..) arayarak yapılabilir:

using System; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 

namespace AnimationCompletedTest { 

    public partial class MainWindow : Window { 

     Canvas panel; 
     public MainWindow() { 
      InitializeComponent(); 
      MouseDown += DoDynamicAnimation; 

      Content = panel = new Canvas(); 
     } 

     void DoDynamicAnimation(object sender, MouseButtonEventArgs args) { 
      for (int i = 0; i < 12; ++i) { 
       var e = new Ellipse { Width = 16, Height = 16, Fill = SystemColors.HighlightBrush }; 
       Canvas.SetLeft(e, Mouse.GetPosition(this).X); 
       Canvas.SetTop(e, Mouse.GetPosition(this).Y); 

       var tg = new TransformGroup(); 
       var translation = new TranslateTransform(30, 0); 
       var translationName = "myTranslation" + translation.GetHashCode(); 
       RegisterName(translationName, translation); 
       tg.Children.Add(translation); 
       tg.Children.Add(new RotateTransform(i * 30)); 
       e.RenderTransform = tg; 

       panel.Children.Add(e); 

       var anim = new DoubleAnimation(3, 100, new Duration(new TimeSpan(0, 0, 0, 1, 0))) { 
        EasingFunction = new PowerEase { EasingMode = EasingMode.EaseOut } 
       }; 

       var s = new Storyboard(); 
       Storyboard.SetTargetName(s, translationName); 
       Storyboard.SetTargetProperty(s, new PropertyPath(TranslateTransform.YProperty)); 
       var storyboardName = "s" + s.GetHashCode(); 
       Resources.Add(storyboardName, s); 

       s.Children.Add(anim); 

       s.Completed += 
        (sndr, evtArgs) => { 
         panel.Children.Remove(e); 
         Resources.Remove(storyboardName); 
         UnregisterName(translationName); 
        }; 
       s.Begin(); 
      } 
     } 

     [STAThread] 
     public static void Main() { 
      var app = new Application(); 
      app.Run(new MainWindow()); 
     } 
    } 
} 
21

film şeridini dışarı bırak:

var T = new TranslateTransform(40, 0); 
Duration duration = new Duration(new TimeSpan(0, 0, 0, 1, 0)); 
DoubleAnimation anim = new DoubleAnimation(30, duration); 
T.BeginAnimation(TranslateTransform.YProperty, anim); 

(sözdizimi için küçük düzeltme)

+0

iyi ve basit, bana yardım ettiniz. –

3

ben XAML/C# Combo kullanarak bir çözüm var. XAML dosyasında tanımlayın:

<UserControl.RenderTransform> 
    <TranslateTransform x:Name="panelTrans" Y="0"></TranslateTransform> 
</UserControl.RenderTransform> 

Bu, C# kodu aşağıdakileri yapın yeteneğini verecektir:

 Storyboard.SetTargetName(mFlyInDA, "panelTrans"); 
     Storyboard.SetTargetProperty(mFlyInDA, new PropertyPath("Y")); 

kalanı her zamanki gibi bir iş. Bir DoubleAnimation oluşturun, özelliklerini ayarlayın, Storyboard'unuza bir çocuk olarak ekleyin, story board'da Begin işlevini çağırın.