尝试动画一组线

时间:2014-09-15 20:48:59

标签: c# wpf

我制作了与此相似的模式...

Hexagon Pattern

通过每个线阵列开始一个故事板并执行计算。虽然,我很难确定如何同时启动多行动画。

这是我迄今为止所尝试的内容:

Canvas canMain = new Canvas();
canMain.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
canMain.Margin = new Thickness(50, 0, 0, 0);
Line[] line = new Line[6];
Storyboard sb;
DoubleAnimation da, da1;
for (int i = 0; i < line.Count(); i++)
{
    line[i].Stroke = Brushes.Red;
    line[i].StrokeThickness = 1;
    line[i].X1 = i+11;
    line[i].Y1 = i+11;
    canMain.Children.Add(line[i]);
    sb = new Storyboard();
    da = new DoubleAnimation(line[i].Y1, 30, new Duration(TimeSpan.FromSeconds(0.5)));
    da1 = new DoubleAnimation(line[i].X1, 30, new Duration(TimeSpan.FromSeconds(0.5)));
    Storyboard.SetTargetProperty(da, new PropertyPath("(Line.Y2)"));
    Storyboard.SetTargetProperty(da1, new PropertyPath("(Line.X2)"));
    sb.Children.Add(da);
    sb.Children.Add(da1);
    line[i].BeginStoryboard(sb);
}

正如你所知,我还没有开始在它背后做数学运算,因为我似乎无法同时触发故事板。或者我应该将所有doubleAnimations存入同一个故事板?这两种方法都让我得到了一个堆栈溢出。我对WPF C#编程比较陌生,所以任何建议或进一步的信息都会非常有用。

编辑帖子以包含例外:

未处理的类型&#39; System.Reflection.TargetInvocationException&#39;发生在PresentationFramework.dll

附加信息:调用目标引发了异常。

1 个答案:

答案 0 :(得分:2)

你的代码很好。我只需要进行一些小改动就能让它发挥作用。我创建了一个名为new_Window的新窗口来测试并在其上创建了一个名为Canvas的{​​{1}}对象。 然后我只为你的代码添加了一行代码:在canMain循环中我必须添加for,因为此时行对象为空。

line[i] = new Line();

我首先将 public new_Window() { InitializeComponent(); AnimateThis(); } private void AnimateThis() { canMain.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; canMain.Margin = new Thickness(50, 0, 0, 0); Line[] line = new Line[6]; Storyboard sb; DoubleAnimation da, da1; for (int i = 0; i < line.Count(); i++) { line[i] = new Line(); line[i].Stroke = Brushes.Red; line[i].StrokeThickness = 1; line[i].X1 = i+11; line[i].Y1 = i+11; canMain.Children.Add(line[i]); sb = new Storyboard(); da = new DoubleAnimation(line[i].Y1, 30, new Duration(TimeSpan.FromSeconds(0.5))); da1 = new DoubleAnimation(line[i].X1, 30, new Duration(TimeSpan.FromSeconds(0.5))); Storyboard.SetTargetProperty(da, new PropertyPath("(Line.Y2)")); Storyboard.SetTargetProperty(da1, new PropertyPath("(Line.X2)")); sb.Children.Add(da); sb.Children.Add(da1); line[i].BeginStoryboard(sb); } } 添加到窗口中,因为我想确保有一个表面可以渲染。