2011-01-03 19 views
7

Bir Canvas kırpıyorum PolyLineSegment elmas biçiminde bir PathGeometry içinde. Bununla birlikte PointCollection'ı canlandırmaya çalışıyorum ve TargetProperty'yi çözümleyemiyorum. http://forums.silverlight.net/forums/p/22239/78225.aspxBir PolyLineSegment'i Silverlight, yani PointCollection'da canlandırmak mümkün mü?

o değerleri var değiştirmek için bir PointCollection bir Point almak bile mümkün mü: Bu Google tüm bu hemen hemen benim yapmaya çalıştığım şey bu buldum sadece diğer referans ve aynı PropertyPath olduğunu bir animasyon mu? Maalesef

cevap

3

Bunu Polyline.Points animasyon mümkündür sanmıyorum ...

olanlar noktaları nesne "System.Windows.Point" dan ve sorundur onların "X" ve "Y o "özellikler bağımlılık özellikleri değil. Maalesef, bir DoubleAnimation ile bir bağımlılık özelliği olmayan bir özelliği canlandırmak için bir yolu yoktur.

Sağladığınız örnekte, animasyonun bir System.Windows.Point değil, PathFigure Segmentine (bağımlılık özelliklerine sahip) dayalı olması sağlandı.

Bunları hareketlendirmek istiyorsanız, Yolunuzdaki PolyLineSegement'i kullanmaktan kaçınmaya çalışırdım.

2

Böyle noktası koleksiyonu animasyon olabilir:

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

(bazı linepoints animasyon - kötü görünüyor ama noktayı gösterir: o)

Ve noktalarını hesaplamak ve daha bunu elde etmek istiyorsanız kodda doldur vb pürüzsüz:

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

boyutunu değiştiren bir kutu çizer - Bunda herhangi noktaları ekleyebilir ve daha fazla veya daha az istediğiniz etkiyi alabilir.

+1

Bu, şeklinize morf benzeri bir değişiklik yapmak kolay olmalıdır. Ölçekleme ve döndürme, dönüşümlerle daha kolaydır. –

İlgili konular