2013-02-11 80 views
1

我得到了這個UserControl,它是一個大約10行10列的Grid。每個單元格包含1個文本塊或1-6個圖像。 我想要做的是動畫化每一行上的所有元素以進行滑動。但是,我無法找到一種方法來動畫整個Grid.Row來做到這一點。Grid.Row上的動畫(全局偏移量)

我不能包裝在一個StackPanel /月的所有元素要麼因爲這將它們放入同一列...

任何人有一個解決的辦法?

謝謝

+1

您是否嘗試過連接到網格本身的FluidMoveBehavior?我認爲它可以通過修改EaseIn來提供你正在尋找的東西。 – 2013-02-11 16:27:22

+0

感謝您的提示。我玩了一小會兒,當你同時添加了很多元素時,它似乎不能很好地工作。動畫僅播放最後添加的元素,而以前沒有動畫。除此之外,您似乎無法控制元素從哪個方向來。我希望我的元素來自屏幕外,但我無法讓它工作。 – robertk 2013-02-12 06:38:57

回答

1

所以我想出了一個工作解決方案,它工作。也許不是那麼優雅,但它的功能與Lumia 920設備的功能相當。

void CreateLoadAnimationForRow(int row, int startTime) 
    { 
     foreach (var child in LayoutRoot.Children.Cast<FrameworkElement>().Where(x => Grid.GetRow(x) == row)) 
     { 
      AddToStoryboard(child, startTime); 
     } 
    } 
    void AddToStoryboard(FrameworkElement element, int startTime) 
    { 
     element.RenderTransform = new CompositeTransform(); 
     var doubleAnimation = new DoubleAnimation 
     { 
      From = -200, 
      To = 0, 
      Duration = new Duration(TimeSpan.FromSeconds(1)), 
      BeginTime = TimeSpan.FromMilliseconds(startTime) 
     }; 

     var objectAnimationUsingKeyFrames = new ObjectAnimationUsingKeyFrames() 
     { 
      BeginTime = TimeSpan.FromMilliseconds(startTime + 10) 
     }; 
     var discreteObjectKeyFrame = new DiscreteObjectKeyFrame() 
     { 
      KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0)), 
      Value = Visibility.Visible 
     }; 

     objectAnimationUsingKeyFrames.KeyFrames.Add(discreteObjectKeyFrame); 

     IEasingFunction easingFunction = new SineEase(); 
     easingFunction.Ease(2); 
     doubleAnimation.EasingFunction = easingFunction; 

     Storyboard.SetTarget(objectAnimationUsingKeyFrames, element); 
     Storyboard.SetTargetProperty(objectAnimationUsingKeyFrames, new PropertyPath("Visibility")); 

     Storyboard.SetTarget(doubleAnimation, element); 
     Storyboard.SetTargetProperty(doubleAnimation, new PropertyPath("(FrameworkElement.RenderTransform).(CompositeTransform.TranslateX)")); 

     storyboardSlideIn.Children.Add(doubleAnimation); 
     storyboardSlideIn.Children.Add(objectAnimationUsingKeyFrames); 

    }