2017-03-15 71 views
1

我有一個形狀爲對角線運動的物體,初始位置是中心,當物體位於窗體的角落時,我想停止運動,將運動返回到初始位置,感謝您的幫助,我有第一次運動,但我現在不能如何回報。帶計時器的移動物體

public void functionThread() 
{ 
    var timer2 = new Timer(); 
    timer2.Interval = 50; 
    timer2.Enabled = true; 

    timer2.Tick += (s, e) => panel1.Location = new Point(panel1.Location.X - 5, panel1.Location.Y - 5); 
} 
+0

首先請確保您使用'System.Windows.Forms.Timer'。很難從你的例子中看出 – MickyD

+0

Threading.Timer可以這樣聲明。 – EpicKip

+0

WPF已經有[動畫](https://msdn.microsoft.com/en-us/library/ms752312(v = vs.110).aspx)。以最簡單的形式,您可以指定一個元素的屬性在一定時間範圍內隨着值的不同而不同。在其最複雜的情​​況下,您可以指定多個轉換的故事板 –

回答

0

該代碼使得面板去從左至右,其起始位置是10,10(BasePoint),它會重新設置面板,一旦碰到邊緣,因此它可以着呢。您也可以停止計時器,一旦你打這個布爾,唯一的變化則是在全球範圍內聲明的計時器,這個答案是通過提供:Nino

bool HitEdge = false; 
Point BasePoint = new Point(10,10); 
Timer timer2 = new Timer(); 

public void functionThread() 
{ 
    timer2.Interval = 50; 
    timer2.Enabled = true; 
    timer2.Tick += timer2_Tick; 
} 

private void timer2_Tick(object sender, EventArgs e) 
{ 
    if((panel1.Left + panel1.Width) >= this.Width) 
    { 
     HitEdge = true; 
    } 
    if (!HitEdge) 
    { 
     panel1.Left += 15; 
    } 
    else 
    { 
     panel1.Location = BasePoint; 
     HitEdge = false; 
    } 
} 
+0

這是正確的解決方案,它可能對OP有用(或者,實際上,它可能是OP要求的解決方案)。所以downvote是不需要的。 – Nino

+0

表單不會處理該計時器,因爲它沒有在表單範圍內聲明。 – LarsTech

+0

@LarsTech快樂嗎? :) – EpicKip

2

移動timer2聲明你的功能並投入形式,像這樣的:

public partial class Form1 : Form 
{ 
    System.Windows.Forms.Timer timer2 = new System.Windows.Forms.Timer(); 

    public Form1() 
    { 
    } 
functionThread化妝方法

Tick事件,使代碼更容易閱讀和維護

timer2.Tick += Timer2_Tick; 

Timer2_Tick對於面板的定位方法檢查,並停止計時器如有必要

private void Timer2_Tick(object sender, EventArgs e) 
{ 
    if (panel1.Left == 0 || panel1.Top == 0) 
    { 
     timer2.Stop(); 
    } 
    else 
     panel1.Location = new Point(panel1.Location.X - 5, panel1.Location.Y - 5); 
} 
+0

他不得不返回到起始位置,從來沒有說過計時器不得不停止 – EpicKip

+0

@EpicKip _「我想停止移動」_ - 這意味着計時器應該停止,以便對操作系統很好。這是一個效率問題 – MickyD

+0

@MickyD「將運動返回到初始位置」 – EpicKip