Tôi có một khung hình WPF mà trên đó tôi tự động tạo các đối tượng từ mã. Các đối tượng này đang được chuyển đổi bằng cách thiết lập thuộc tính RenderTransform và một hoạt ảnh cần được áp dụng một trong các biến đổi đó. Hiện tại, tôi không thể nhận được các thuộc tính của bất kỳ biến đổi nào thành animate (mặc dù không có ngoại lệ nào được nâng lên và hoạt ảnh xuất hiện để chạy - sự kiện đã hoàn thành được nâng lên).WPF: Hoạt hình TranslateTransform từ mã
Ngoài ra, nếu hệ thống hoạt ảnh bị nhấn mạnh, đôi khi sự kiện Storyboard.Completed không bao giờ được nâng lên.
Tất cả các ví dụ tôi đã thực hiện trên các biến đổi từ XAML. MSDN documentation gợi ý rằng thuộc tính x: Name của một biến đổi phải được đặt để nó có thể hoạt hình, nhưng tôi chưa tìm được cách làm việc để đặt nó từ mã.
Bất kỳ ý tưởng nào?
Dưới đây là danh sách mã đầy đủ nhằm tái tạo vấn đề:
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());
}
}
}
tốt và đơn giản, bạn đã giúp tôi hết sức. –