2014-04-10 1 views
0

WPF 및 C#. C# 코드의 애니메이션. 많은 포인트 (> 1000)의 경로 애니메이션이 있습니다. 애니메이션은 쉽게 스토리 보드와 포인트 애니메이션을 사용하여 프로그래밍 방식으로 만들어집니다. 반복 동작은 영원히 설정됩니다. 시간이 지나면 편의 기능이 꺼집니다. 나는 그것이 일종의 최적화라고 생각합니다. 쉽게 기능을 영원히 유지할 수 있도록이 기능을 끌 수 있습니까?약간의 시간이 지나면 wpf 애니메이션에서 자동으로 기능이 꺼집니다.

이것은 내 mainwindow_loaded 기능입니다. 내 xaml 코드에는 그리드라는 그리드가 하나만 있습니다. 라인이

BeginTime = new TimeSpan(0, 0, 0, 0, i * 10 + r.Next(200)), 

같이 그리고 기능은 사라지지 않을 것이다 완화 될 수 있도록

void MainWindow_Loaded(object sender, RoutedEventArgs e) 
    { 
     Random r = new Random(10); 

     Storyboard sb = new Storyboard(); 

     Path p = new Path 
     { 
      Width = 500, 
      Height = 500, 

      Name = "Path", 
      Fill = Brushes.Green, 
      HorizontalAlignment = System.Windows.HorizontalAlignment.Left, 
      Margin = new Thickness(25, 25, 0, 0), 
      VerticalAlignment = System.Windows.VerticalAlignment.Top 
     }; 

     PathGeometry pg = new PathGeometry(); 
     var pf = new PathFigure { StartPoint = new Point(0, 250) }; 

     for (int i = 0; i < this.ActualWidth; i++) 
     { 
      LineSegment ls = new LineSegment { Point = new Point(i, 50) }; 
      var pa = new PointAnimation 
      { 
       To = new Point(i, 80), 
       Duration = new Duration(new TimeSpan(0, 0, 0, 2)), 
       BeginTime = new TimeSpan(0, 0, 0, 0, i * 10), //+ r.Next(200) 
       AutoReverse = true, 
       RepeatBehavior = RepeatBehavior.Forever, 
       EasingFunction = new SineEase { EasingMode = EasingMode.EaseInOut } 
      }; 

      Storyboard.SetTargetProperty(pa, new PropertyPath("(Path.Data).(PathGeometry.Figures)[0].(PathFigure.Segments)[" + i + "].(LineSegment.Point)")); 
      Storyboard.SetTarget(pa, p); 

      sb.Children.Add(pa); 

      pf.Segments.Add(ls); 
     } 

     LineSegment endSegment = new LineSegment { Point = new Point(this.ActualWidth, 250) }; 
     pf.Segments.Add(endSegment); 

     pg.Figures.Add(pf); 

     p.Data = pg; 

     grid.Children.Add(p); 

     sb.Begin(); 
    } 

봅니다 코드 + r.Next (200)을 넣어.

+1

애니메이션 코드를 표시합니다. –

+0

확인 내 질문 업데이트 :) – masterkawaster

답변

0

이 방법이 도움이 될지 모르지만 모든 단일 애니메이션에 대해 별도의 개체를 만드는 대신 EasingFunction에 공유 인스턴스를 사용하지 않는 이유는 무엇입니까? 귀하의 코드에서 그들은 모두 같아 보입니까?

내가 알아챈 또 하나의 점은로드 콜백에서 즉시 애니메이션을 시작한다는 것입니다.하지만 WPF 및 Silverlight를 사용한 경험에서로드 된 이벤트는 프레임 워크에 대해 매우 특별하며 사용자가 수행하는 작업에 매우주의해야합니다 그것. 스토리 보드의 Begin 메서드를 다음과 같이 조금 늦게 호출하는 방법 :

this.Dispatcher.BeginInvoke(new Action(() => db.BeginStoryboard())); 
관련 문제