2009-07-06 16 views
9

Estoy trabajando en un proyecto que implica dibujar trazados curvos entre dos objetos. Actualmente, he estado escribiendo algunos códigos de prueba para jugar con curvas y animaciones Bezier. La primera prueba es simplemente mover el punto final (Punto3) del objeto de origen (un rectángulo) al objeto de destino (otro rectángulo), en línea recta. Aquí está el código que establece la línea real:Animación WPF - Animación de los puntos de la curva de Bezier

 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, así que ahora tenemos una línea se derrumbó a un punto. Ahora, vamos a animar esa línea, al pasar de _rect1 a _rect2 (los dos objetos en los puntos finales):

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

funciona de maravilla. Sin embargo, cuando trato de hacerlo con un guión gráfico, no obtengo nada. Aquí está el código storyboard:

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

Nada se mueve. Sospecho que hay un problema con lo que estoy alimentando SetTarget o SetTargetProperty, pero parece que no puede resolverlo. ¿Alguien tiene experiencia con la animación de puntos de línea/bezier en WPF?

+0

No estoy seguro de que esto resuelva su problema, pero puede encontrar algo de inspiración en esta publicación: http://www.japf.fr/?p=227 –

Respuesta

0

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

No intente llamar a los miembros del guión gráfico (por ejemplo, Begin) dentro del constructor de la página. Esto hará que la animación falle silenciosamente.

..en caso de que estuvieras haciendo eso!

El ejemplo de esa página también establece Duración propiedad del objeto Storyboard.

Finalmente un consejo general, con este tipo de objetos UI y extraños gráficos de objetos XAML una vez que tenga los elementos básicos que funcionan mejor para ponerlo en un ResourceDictionary y usar algo como 'Resources ["Name"] como Storyboard' para recuperarlo más tarde.

Espero que sea útil: se ve como la duración que falta debería hacer el truco.

edición: Parece que La duración se establece en Automático por defecto, voy a ver lo más que pueda llegar a, por favor tengan paciencia conmigo .. :)

2

Reconstruí su código, y esto funciona:

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

Eso lo corrige :) Parece que el objetivo debe ser el control en sí mismo.

Yendo un paso más hacia abajo, como esto:

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

... da InvalidOperationException:

'[Desconocido]' valor de la propiedad en las figuras de la trayectoria '[0] .Segments [ 0] .Point3 'apunta a la instancia inmutable de' System.Windows.Media.PathFigure '.

Cuestiones relacionadas