J'ai un canevas WPF sur lequel je crée dynamiquement des objets à partir du code. Ces objets sont en cours de transformation en définissant la propriété RenderTransform et une animation doit être appliquée à l'une de ces transformations. Actuellement, je ne peux pas obtenir les propriétés d'une transformation à animer (bien qu'aucune exception ne soit levée et que l'animation semble s'exécuter - l'événement terminé est levé).WPF: Animation de TranslateTransform à partir du code
En outre, si le système d'animation est sollicité, il arrive que l'événement Storyboard.Completed ne soit jamais déclenché.
Tous les exemples que j'ai rencontrés animent les transformations de XAML. MSDN documentation suggère que la propriété x: Name d'une transformation doit être définie pour qu'elle soit animable, mais je n'ai pas trouvé de moyen de le définir à partir du code.
Des idées?
est ici la liste complète des codes qui reproduit le problème:
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());
}
}
}
bon et simple, vous m'avez aidé à attribuer. –