2011-01-03 6 views
7

私はPathGeometryにダイヤモンド形のPolyLineSegmentがあるキャンバスをクリッピングしています。私はそれのPointCollectionをアニメーション化しようとしていますが、TargetPropertyを解決できないようです。 http://forums.silverlight.net/forums/p/22239/78225.aspxSilverlightでPolyLineSegment、つまりPointCollectionをアニメーション化できますか?

で値をです変更するためにPointCollectionからPointを取得することも可能です:これは、Googleのすべてが、それはかなり私がやろうとしているものです見つけた唯一の他の参照と同じPropertyPathですアニメーション?

答えて

3

残念ながら、私はそれがPolyline.Pointsをアニメーション化することが可能であるとは思わない...

それらのポイントオブジェクトが「System.Windows.Point」からのものであり、問​​題はその「X」と「Yということですプロパティは依存プロパティではありません。残念ながら、DoubleAnimationの依存関係プロパティではないプロパティをアニメーション化する方法はありません。

この例では、(継承プロパティを持つ)PathFigureセグメントに基づいており、System.Windows.Pointではなく、アニメーションが提供されています。

私はそれらをアニメートする場合は、あなたのパスに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

これで、あなたの姿にモーフのような変更を加えるのは簡単なはずです。変換でスケールと回転が簡単になります。 –

関連する問題