2013-10-23 72 views
1

我在WPF中控制(這是一個包含圓的自定義控件)。如何在WPF中移動控件

我需要每60ms移動一次。

我有「位置」(類具有2個屬性:X和Y)的陣列,並且我這個移動它:與一個全局變量

timer_tick() 
{ 
    myControl.Margin = new Thickness { Left = MyArray[i].X, Top = MyArray[i].Y}; 
    i++; 
} 

但我能做得更好嗎?使用類似的東西:

public static void MoveTo(this Image target, double newX, double newY) 
{ 
    var top = Canvas.GetTop(target); 
    var left = Canvas.GetLeft(target); 
    TranslateTransform trans = new TranslateTransform(); 
    target.RenderTransform = trans; 
    DoubleAnimation anim1 = new DoubleAnimation(top, newY - top, TimeSpan.FromMilliseconds(60)); 
    DoubleAnimation anim2 = new DoubleAnimation(left, newX - left, TimeSpan.FromMilliseconds(60)); 
    trans.BeginAnimation(TranslateTransform.XProperty,anim1); 
    trans.BeginAnimation(TranslateTransform.YProperty,anim2); 
} 

在每個tick中?

謝謝

回答

3

非常接近。但是沒有必要在計時器中調用它。讓動畫做好工作;這就是它的目的。只需將動畫設置爲在所需速度的時間範圍內從原點到目的地。如果您需要提前結束,您可以隨時中斷動畫。

0

其他人已經發布了最好的方法,這是使用動畫,所以這裏有一個不太「好」的方式,但可能工作正常。

如果你正在使用像索引器「i」這樣的變量(小心地把它稱爲​​全局變量 - 具體說明它的範圍),那麼爲什麼不做另一個呢?

在一流水平,創造一個變量...

Thickness awful_marg_variable; 

而在你的初始化,初始化並分配參考控件的頁邊距:

awful_marg_variable = new Thickness { Left = MyArray[0].X, Top = MyArray[0].Y}; 
myControl.Margin = awful_marg_variable; 

然後在你的計時器滴答程序,你可以操縱那個變量...

awful_marg_variable.Left = MyArray[i].X; 
awful_marg_variable.Top = MyArray[i].Y; 

最後,你可以尊重l你剛纔做的可怕的事情,或者其他什麼。切勿大量使用。有些人會說永遠不要這樣做。但有時你只需要完成工作,而這是另一種方法。