2013-11-21 44 views
1

我在Windows 8中創建一個信息亭應用,但在8.1分配訪問應用程序將使用它。我想爲廣告創建一個動畫。動畫的概念作爲圖像附加到此線程中。基本上會有6-10張L形圖像(右側一列&底部一排)。現在,一個極端右下角的廣告將靜止不動。列中的廣告將像HTML的選取框一樣遍歷並在那時排到行,行中的廣告將遍歷併到達列。通過這種方式,廣告將繼續以時鐘方式移動。我如何在我的C#/ XAML應用程序中實現這一點?我應該用不知道哪個屬性動畫

請不是廣告將永遠不會在頂部或左邊顯示。該廣告是<Image /> &來源是互聯網網址。所有廣告都在ItemsControl

enter image description here

+0

你可以使用一個[關鍵幀動畫](http://msdn.microsoft.com/en-us/library/ms742524(V = vs.110)的.aspx),其中設置動畫的x和y屬性你的元素。在你的情況下,你將不得不定義4個關鍵幀:一個用於從頂部進入,一個用於移動到底部,一個用於在對角線上移動,一個用於移動到左邊。那麼你從頭開始重複動畫 –

+0

我沒有固定數量的廣告,所以我該怎麼辦? X和Y對於我認爲的每個圖像都會有所不同。 – Xyroid

+0

對於x&y您可以延遲動畫。但我認爲只有通過xaml才能做到您想要的功能,我認爲最好創建一個新的自定義用戶控件來完成廣告顯示工作。並使用一些C#在那裏 –

回答

1

呸,讓我們開始,我是多麼恨已經這個程序。

我們答案。

我不認爲你真的需要一個動畫。您可能會經常更換廣告。而他們的立場的簡單改變並不意味着他們的立場轉變就足夠了。

試試這個:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition /> 
     <ColumnDefinition /> 
     <ColumnDefinition /> 
     <ColumnDefinition /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition /> 
     <RowDefinition /> 
     <RowDefinition /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 
    <Rectangle Fill="White" Grid.Column="0" Grid.ColumnSpan="3" Grid.Row="0" Grid.RowSpan="3" /> 
    <Rectangle x:Name="Ad1" Fill="Green" Grid.Column="3" Grid.Row="3" /> 
    <Rectangle x:Name="Ad2" Fill="IndianRed" Grid.Column="0" Grid.Row="3" /> 
    <Rectangle x:Name="Ad3" Fill="Red" Grid.Column="1" Grid.Row="3" /> 
    <Rectangle x:Name="Ad4" Fill="DarkRed" Grid.Column="2" Grid.Row="3" /> 
    <Rectangle x:Name="Ad5" Fill="Pink" Grid.Column="3" Grid.Row="0" /> 
    <Rectangle x:Name="Ad6" Fill="HotPink" Grid.Column="3" Grid.Row="1" /> 
    <Rectangle x:Name="Ad7" Fill="Purple" Grid.Column="3" Grid.Row="2" /> 
</Grid> 

有了這個:

public MainPage() 
{ 
    this.InitializeComponent(); 
    var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) }; 
    timer.Tick += (s, e) => Move(); 
    timer.Start(); 
} 

void Move() 
{ 
    var ads = new Rectangle[] { Ad1, Ad2, Ad3, Ad4, Ad5, Ad6, Ad7 }; 
    foreach (var item in ads) 
    { 
     var row = (int)item.GetValue(Grid.RowProperty); 
     var col = (int)item.GetValue(Grid.ColumnProperty); 
     if (row == 3) 
     { 
      if (col == 0) 
      { 
       row = 0; 
       col = 3; 
      } 
      else 
       col--; 
     } 
     else 
     { 
      if (row == 2) 
      { 
       row = 3; 
       col = 2; 
      } 
      else 
       row++; 
     } 
     item.SetValue(Grid.RowProperty, row); 
     item.SetValue(Grid.ColumnProperty, col); 
    } 
} 

而且它看起來相當不錯。

但如果你必須有動畫,試試這個。

void Move() 
{ 
    var ads = new Rectangle[] { Ad1, Ad2, Ad3, Ad4, Ad5, Ad6, Ad7 }; 
    foreach (var item in ads) 
    { 
     var row = (int)item.GetValue(Grid.RowProperty); 
     var col = (int)item.GetValue(Grid.ColumnProperty); 
     var x = item.ActualWidth; 
     var y = item.ActualHeight; 

     // bottom 
     if (row == 3) 
     { 
      // left-last 
      if (col == 0) 
      { 
       row = 0; 
       col = 3; 
       x = -x; 
       y = 0; 
      } 
      // others 
      else 
      { 
       col--; 
       x = -x; 
       y = 0; 
      } 
     } 
     // right 
     else 
     { 
      // bottom-last 
      if (row == 2) 
      { 
       row = 3; 
       col = 2; 
       x = -x; 
      } 
      else 
      { 
       row++; 
       x = 0; 
      } 
     } 

     var dr = new Duration(TimeSpan.FromSeconds(.5)); 
     var tx = item.RenderTransform = new TranslateTransform(); 

     var ax = new DoubleAnimation { To = x, Duration = dr }; 
     Storyboard.SetTarget(ax, tx); 
     Storyboard.SetTargetProperty(ax, "X"); 

     var ay = new DoubleAnimation { To = y, Duration = dr }; 
     Storyboard.SetTarget(ay, tx); 
     Storyboard.SetTargetProperty(ay, "Y"); 

     var st = new Storyboard { FillBehavior = FillBehavior.HoldEnd }; 
     st.Children.Add(ax); 
     st.Children.Add(ay); 
     st.Completed += (s, e) => 
     { 
      item.SetValue(Grid.RowProperty, row); 
      item.SetValue(Grid.ColumnProperty, col); 
      st.Stop(); 
     }; 
     st.Begin(); 
    } 
} 

祝你好運!

+0

是的,我預計傑裏肯定會幫助我。謝了哥們。我喜歡第二個解決方案是動畫。但是有可能擁有流暢的持續動畫嗎?我注意到故事板完成後有一個小停止。是否有可能製作出像新聞動畫那樣的動畫? – Xyroid

+0

再次,討厭這個應用程序。只需調整時間,以使動畫和timer.tick相同。 (或接近相同,需要一些調整)否則,可能需要查看Charles Petzold的AnimationAlongPath(或某些符號)。不會很簡單。 –

+0

想到另一種方式。由於這些只是圖像。你可以很容易地在用戶界面中放置一個scrollviewer vert和horz,併爲水平偏移設置動畫。它應該可以工作,但是需要在每個查看器中放置兩倍的廣告,這也意味着您將擁有4倍的廣告,因爲它們將位於兩個位置。 –

相關問題