【问题标题】:Trying to Animate a group of lines尝试为一组线条设置动画
【发布时间】:2014-09-15 20:48:59
【问题描述】:

我正在做一个类似这样的模式......

通过按线阵列启动故事板并执行计算。虽然,我在确定如何同时启动多行动画时遇到了麻烦。

这是我迄今为止尝试过的:

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 存储到同一个故事板中?这两种方法都让我有一个stackoverflow。我对 WPF C# 编程比较陌生,因此任何建议或更多信息都会非常有帮助。

编辑帖子以包含例外:

PresentationFramework.dll 中出现“System.Reflection.TargetInvocationException”类型的未处理异常

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

【问题讨论】:

  • 我似乎无法同时触发所有故事板...那这段代码会做什么呢?
  • 导致程序崩溃。
  • 也许您可以编辑您的问题并添加Exception 详细信息?此外,您应该只使用最少数量的线来创建您的图案...您可以使用VisualBrush 在更大的区域内平铺图案,这比全部绘制要便宜得多。
  • 我直到明天才离开我的办公室电脑,所以我很抱歉我目前无法发布异常。感谢您对视觉画笔的建议,是否有任何链接参考可以让我正确了解如何使用该方法进行大面积动画和绘图?
  • MSDN 上的VisualBrush Class 页面怎么样?

标签: c# wpf


【解决方案1】:

您的代码基本没问题。我只需要做一个小改动就可以让它工作。我创建了一个名为new_Window 的新窗口进行测试,并在其上创建了一个名为canMainCanvas 对象。 然后我只在您的代码中添加了一行代码:在您的 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);
     }
  }

我首先将Canvas 添加到窗口中,因为我想确保有一个可以渲染的表面。

【讨论】:

    猜你喜欢
    • 2017-07-25
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多