2011-01-03 8 views
7

Przycinaję płótno, które mam w kształcie rombu PolyLineSegment w PathGeometry. Próbuję jednak ożywić PointCollection i nie mogę rozwiązać TargetProperty. To tylko inne odniesienie wszystkie Google okazało się, że jest dość dużo, co staram się robić i to samo PropertyPath: http://forums.silverlight.net/forums/p/22239/78225.aspxCzy można animować PolyLineSegment w Silverlight, tj. PointCollection?

Czy to w ogóle możliwe, aby uzyskać Point od A PointCollection w celu zmiany jego wartości animacja?

Odpowiedz

3

Niestety nie sądzę, że jest możliwe, aby animować Polyline.Points ...

Punkty te są od obiektu „System.Windows.Point” i problem jest to, że ich „X” i „Y "właściwości nie są właściwościami zależności. Niestety nie ma możliwości animowania właściwości, która nie jest właściwością zależności z DoubleAnimation.

W podanym przykładzie animacja jest oparta na segmencie PathFigure (posiadającym właściwości zależności), a nie System.Windows.Point.

Staram się unikać używania PolyLineSegement na twojej ścieżce, jeśli chcesz je animować.

2

Można animować kolekcję punkt tak:

 <Canvas Background="Tan" Width="100" Height="300" Margin="5,0,0,0"> 
     <Path Stroke="RosyBrown" StrokeThickness="4" > 
      <Path.Data> 
      <PathGeometry> 
       <PathGeometry.Figures> 
       <PathFigure StartPoint="5,50"> 
        <PolyLineSegment x:Name="PLS" ></PolyLineSegment> 
       </PathFigure> 
       </PathGeometry.Figures> 
      </PathGeometry> 
      </Path.Data> 
     </Path> 
     <Canvas.Triggers> 
      <EventTrigger RoutedEvent="Canvas.Loaded" > 
      <BeginStoryboard> 
       <Storyboard x:Name="sbPathUpDown" BeginTime="0:0:0"> 
       <ObjectAnimationUsingKeyFrames x:Name="objAni" 
            Duration="0:0:2" 
           AutoReverse="True" RepeatBehavior="Forever" 
            Storyboard.TargetName="PLS" 
            Storyboard.TargetProperty="Points" > 
        <DiscreteObjectKeyFrame Value="10,50 90,50" KeyTime="0:0:0.05"></DiscreteObjectKeyFrame> 
        <DiscreteObjectKeyFrame Value="10,60 90,50" KeyTime="0:0:0.5"></DiscreteObjectKeyFrame> 
        <DiscreteObjectKeyFrame Value="10,70 105,50" KeyTime="0:0:0.9"></DiscreteObjectKeyFrame> 
        <DiscreteObjectKeyFrame Value="10,60 100,40" KeyTime="0:0:1.2"></DiscreteObjectKeyFrame> 
        <DiscreteObjectKeyFrame Value="10,50 100,50" KeyTime="0:0:1.5"></DiscreteObjectKeyFrame> 
        <DiscreteObjectKeyFrame Value="10,60 90,50" KeyTime="0:0:1.7" ></DiscreteObjectKeyFrame> 
       </ObjectAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
      </EventTrigger> 
     </Canvas.Triggers> 
     </Canvas> 

(animuje niektóre linepoints - wygląda źle, ale ilustruje punkt: o)

A jeśli chcesz obliczyć punkty i dostać więcej gładka itp można wypełnić go w kodzie:

objAni.KeyFrames.Clear(); 
    double offsetx = 10.0; double offsety = 50; 
    double w = 40; double h = 40; 
    for (int i = 0; i < 20; i++) 
    { 
    var scale = i * 0.1; 
    var ww = w * scale; 
    var hh = h * scale; 
    var pts = new PointCollection(); 
    pts.Add(new Point(offsetx, offsety)); 
    pts.Add(new Point(offsetx + ww, offsety)); 
    pts.Add(new Point(offsetx + ww, offsety + hh)); 
    pts.Add(new Point(offsetx, offsety + hh)); 
    pts.Add(new Point(offsetx, offsety)); 

    objAni.KeyFrames.Add(new DiscreteObjectKeyFrame { Value = pts, KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(i/10.0)) }); 
    } 

Rysuje pudełko, który zmienia rozmiar - można dodawać żadnych punktów do niego i uzyskać pożądany efekt bardziej lub mniej.

+1

Dzięki temu łatwo będzie zmienić wygląd postaci. Skalowanie i obracanie jest łatwiejsze dzięki transformacjom. –

Powiązane problemy