7

我正在剪裁我拥有的带有菱形的PolyLineSegment画布PathGeometry。我正在尝试为它的 PointCollection 设置动画,但似乎无法解析 TargetProperty。这是所有谷歌发现的唯一其他参考资料,这几乎是我想要做的,也是一样的PropertyPathhttp ://forums.silverlight.net/forums/p/22239/78225.aspx

甚至可以Point从 aPointCollection中获取 a 以更改其在动画中的值吗?

4

2 回答 2

3

不幸的是,我认为制作 Polyline.Points 的动画是不可能的......

这些点对象来自“System.Windows.Point”,问题是它们的“X”和“Y”属性不是依赖属性。不幸的是,无法使用 DoubleAnimation 为不是依赖属性的属性设置动画。

在您提供的示例中,动画基于 PathFigure Segment(具有依赖属性)而不是 System.Windows.Point。

如果您想为它们设置动画,我会尽量避免在您的路径中使用 PolyLineSegement。

于 2011-01-06T13:57:14.533 回答
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>

(动画一些线点 - 看起来很糟糕,但说明了这一点: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)) });
  }

绘制一个改变大小的框 - 您可以在其中添加任何点并获得或多或少想要的效果。

于 2011-01-12T22:50:04.247 回答