2011-01-03 1 views
7

저는 캔버스를 자르고 있어요 PathGeometry에 다이아몬드 모양의 PolyLineSegment가 있습니다. 그래도 그것의 PointCollection에 애니메이션을 적용하려고하는데 TargetProperty를 해결할 수없는 것처럼 보입니다. http://forums.silverlight.net/forums/p/22239/78225.aspxSilverlight에서 PolyLineSegment, 즉 PointCollection을 애니메이션화 할 수 있습니까?

그것의 값을의 변경하기 위해 PointCollection에서 Point을 얻을도 가능 :이 구글의 모든 것을 거의 내가 할 노력하고있어 무엇을 볼 수있는 유일한 기준과 동일 PropertyPath입니다 애니메이션? 불행하게도

답변

3

나는 그게 Polyline.Points을 애니메이션으로 가능하다고 생각하지 않습니다 ...

그 점을 객체는 "System.Windows.Point"에서이며, 문제는 자신의 "X"와 "Y 그 "속성은 종속성 속성이 아닙니다. 불행히도 DoubleAnimation의 종속성 속성이 아닌 속성에 애니메이션을 적용하는 방법은 없습니다.

제공 한 예제에서 애니메이션은 System.Windows.Point가 아닌 PathFigure Segment (종속성 속성이 있음)를 기반으로합니다.

애니메이션을 적용하려면 경로에 PolyLineSegement를 사용하지 않는 것이 좋습니다.

2

당신은이 같은 점 수집을 애니메이션 수 :

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

(일부 linepoints을 애니메이션 - 나쁜 보이지만 점을 보여 O)

그리고 당신은 포인트를 계산하고 그것을 더 얻으려면 당신이 코드를 채울 수 등을 부드럽게 :

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

크기를 변경하는 상자를 그립니다 - 당신이 그것에 어떤 점을 추가하고 더 많거나 적은 원하는 효과를 얻을 수 있습니다.

+1

이렇게하면 그림에 모프와 같은 변경을 쉽게 할 수 있습니다. 변형으로 스케일 및 회전이 더 쉽습니다. –

관련 문제