2009-07-06 43 views
9

Tôi đang làm việc trên một dự án liên quan đến việc vẽ đường cong cong giữa hai đối tượng. Hiện tại, tôi đã viết một số mã thử nghiệm để chơi xung quanh với các đường cong và hoạt hình bezier. Thử nghiệm đầu tiên đơn giản là di chuyển điểm cuối (Point3) từ đối tượng gốc (hình chữ nhật) đến đối tượng đích (hình chữ nhật khác), theo một đường thẳng. đây là mã thiết lập dòng thực tế:WPF Animation - Điểm động Bezier đường cong

 connector = new Path(); 
     connector.Stroke = Brushes.Red; 
     connector.StrokeThickness = 3; 

     PathGeometry connectorGeometry = new PathGeometry(); 
     PathFigure connectorPoints = new PathFigure(); 
     connectorCurve = new BezierSegment(); 

     connectorPoints.StartPoint = new Point((double)_rect1.GetValue(Canvas.LeftProperty) + _rect1.Width/2, 
      (double)_rect1.GetValue(Canvas.TopProperty) + _rect1.Height/2); 
     connectorCurve.Point1 = connectorPoints.StartPoint; 
     connectorCurve.Point2 = connectorPoints.StartPoint; 
     connectorCurve.Point3 = connectorPoints.StartPoint; 

     connectorPoints.Segments.Add(connectorCurve); 
     connectorGeometry.Figures.Add(connectorPoints); 
     connector.Data = connectorGeometry; 
     MainCanvas.Children.Add(connector); 

OK, vì vậy hiện tại chúng tôi có một đường bị thu hẹp thành một điểm. Bây giờ, hãy tạo hiệu ứng cho dòng đó, chuyển từ _rect1 sang _rect2 (hai đối tượng tại điểm cuối):

 PointAnimation pointAnim = new PointAnimation(); 
     pointAnim.From = connectorCurve.Point3; 
     pointAnim.To = new Point((double)_rect2.GetValue(Canvas.LeftProperty) + _rect2.Width/2, 
      (double)_rect2.GetValue(Canvas.TopProperty) + _rect2.Height/2); 
     pointAnim.Duration = new Duration(TimeSpan.FromSeconds(5)); 
     board.Children.Add(pointAnim); 

Hoạt động đẹp mắt. Tuy nhiên, khi tôi cố gắng làm điều đó với một bảng phân cảnh, tôi chẳng nhận được gì cả. Dưới đây là mã kịch bản:

 Storyboard board = new Storyboard(); 
     PointAnimation pointAnim = new PointAnimation(); 
     pointAnim.From = connectorCurve.Point3; 
     pointAnim.To = new Point((double)_rect2.GetValue(Canvas.LeftProperty) + _rect2.Width/2, 
      (double)_rect2.GetValue(Canvas.TopProperty) + _rect2.Height/2); 
     pointAnim.Duration = new Duration(TimeSpan.FromSeconds(5)); 

     Storyboard.SetTarget(pointAnim, connectorCurve); 
     Storyboard.SetTargetProperty(pointAnim, new PropertyPath(BezierSegment.Point3Property)); 
     board.Children.Add(pointAnim); 
     board.Begin(); 

Không có gì di chuyển. Tôi nghi ngờ có một vấn đề với những gì tôi đang cho ăn SetTarget hoặc SetTargetProperty, nhưng dường như không thể tìm ra nó. Có ai có kinh nghiệm với dòng động/bezier điểm trong WPF?

+0

Tôi không chắc chắn rằng sẽ giải quyết được vấn đề của bạn, nhưng bạn có thể tìm thấy một số nguồn cảm hứng trong bài đăng này: http://www.japf.fr/?p=227 –

Trả lời

0

http://msdn.microsoft.com/en-us/library/system.windows.media.animation.storyboard(VS.95).aspx nói:

Đừng cố gắng để gọi các thành viên Storyboard (ví dụ, Begin) trong constructor của trang. Điều này sẽ làm cho hoạt ảnh thất bại âm thầm.

..trong trường hợp bạn đang làm điều đó!

Mẫu trên trang đó cũng đặt thuộc tính Thời lượng của đối tượng Storyboard. Cuối cùng là một mẹo chung, với các loại đối tượng giao diện người dùng và đồ thị XAML lạ khi bạn đã có những điều cơ bản làm việc tốt nhất để đặt nó trong một ResourceDictionary và sử dụng một cái gì đó như 'Tài nguyên ["Tên"] như Storyboard' để lấy lại sau.

Hy vọng điều đó hữu ích: có vẻ như Thiếu thời gian nên thực hiện thủ thuật.

chỉnh sửa: Hình như Thời gian được thiết lập để tự động theo mặc định, tôi sẽ xem những gì khác tôi có thể đưa ra, xin vui lòng chịu với tôi .. :)

2

tôi tái mã của bạn, và các công trình này:

Storyboard.SetTarget(pointAnim, connector); 
Storyboard.SetTargetProperty(pointAnim, new PropertyPath("Data.Figures[0].Segments[0].Point3")); 

Sửa lỗi đó :) Có vẻ như mục tiêu cần phải là chính kiểm soát.

Đi thêm một bước xuống, như thế này:

Storyboard.SetTarget(pointAnim, connectorGeometry); 
Storyboard.SetTargetProperty(pointAnim, new PropertyPath("Figures[0].Segments[0].Point3")); 

... cung cấp cho các InvalidOperationException:

'[Unknown]' giá trị tài sản trong các hình của con đường [0] .Segments [ 0] .Point3 'trỏ đến trường hợp bất biến của' System.Windows.Media.PathFigure '.

Các vấn đề liên quan