Можно ли анимировать PolyLineSegment в Silverlight, то есть PointCollection? - PullRequest
7 голосов
/ 03 января 2011

Я обрезаю свой Холст ромбовидным PolyLineSegment в PathGeometry.Я пытаюсь оживить PointCollection этого, и, похоже, не могу разрешить TargetProperty.Это единственное упоминание, которое обнаружил весь Google, и это почти то же, что я пытаюсь сделать.PointCollection чтобы изменить его значения в анимации?

Ответы [ 2 ]

3 голосов
/ 06 января 2011

К сожалению, я не думаю, что это возможно, чтобы оживить Polyline.Points ...

Эти объекты точек взяты из "System.Windows.Point", и проблема в том, что их свойства "X" и "Y" не являются свойствами зависимости. К сожалению, в DoubleAnimation нет способа анимировать свойство, которое не является свойством зависимости.

В приведенном вами примере анимация основана на сегменте PathFigure (со свойствами зависимости), а не на System.Windows.Point.

Я бы постарался не использовать PolyLineSegement в вашем Пути, если вы хотите их анимировать.

2 голосов
/ 13 января 2011

Вы можете анимировать набор точек следующим образом:

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

(анимирует некоторые линейные точки - выглядит плохо, но иллюстрирует точку: 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)) });
  }

Рисует прямоугольник, который меняет размер - вы можете добавить к нему любые точки и получить эффект, который вы хотите более или менее.

...