2014-01-15 92 views
1

我一整天都在嘗試,並且查找了各種各樣的想法...並沒有真正的幫助。 當我按下一個按鈕時,如「JOG」,它將持續移動一個CNC機牀軸,只要按下按鈕,鬆開後它就會停止。只要我按下按鈕,如何製作一個winform按鈕「做某事」?

爲了測試這個,我使用了一個「picuture/LED」,當我按住時,應該是...當我釋放時,它應該關閉。

按下按鈕應該=只有在按下時纔會執行某些操作。 釋放同樣的按鈕=停止做你現在正在做的任何事情。

我相信你的高級人員,這可能是101 ...但對我來說...它正在吃我的午餐...幫助?

+0

這是一個windows窗體上的按鈕? –

+0

是這樣的嗎? http://stackoverflow.com/questions/3727715/repeatbutton-for-winforms – steveg89

+1

發佈您的當前代碼。 –

回答

3

您可以使用MouseDownMouseUp事件。當命中MouseDown事件時,調用一個循環並執行操作的方法。一旦命中MouseUp,停止循環。

private bool _run = false; 

public void button_MouseDown(object sender, EventArgs e) 
{ 
    _run = true; 
    MyAction(); 
} 

public void button_MouseUp(object sender, EventArgs e) 
{ 
    _run = false; 
} 

public void MyAction() 
{ 
    while(_run) 
    { 
     //You actions 
    } 
} 

請注意,上面的示例會佔用UI線程。你應該使用BackgroundWorker或類似的東西在另一個線程上運行它。

+3

沒有線程可能會鎖定您的用戶界面。小心這個。否則好的解決方案 –

+0

謝謝,...我會在需要此功能的按鈕上嘗試此鼠標代碼。我會報告我能做些什麼。 – jeffserv

2

一般來說,看看鼠標上下的事件。我會讓它在鼠標關閉時異步調用某個函數(而不是在UI線程上)。當鼠標事件觸發時停止它。 System.Threading有一些很好的模型。嘗試在那裏搜索。

你想要啓動和停止一個線程,在這個線程中循環執行你的動作。

1

我會做我自己的子類,像這樣:

public class RepeatButton : Button 
{ 
    readonly Timer timer = new Timer(); 

    public event EventHandler Depressed; 

    public virtual TimeSpan Interval 
    { 
     get { return TimeSpan.FromMilliseconds(timer.Interval); } 
     set { timer.Interval = (int)value.TotalMilliseconds; } 
    } 

    public RepeatButton() 
    { 
     timer.Interval = 100; 
     timer.Tick += delegate { OnDepressed(); }; 
    } 

    protected override void OnMouseUp(MouseEventArgs e) 
    { 
     base.OnMouseUp(e); 
     timer.Stop(); 
    } 

    protected override void OnMouseDown(MouseEventArgs e) 
    { 
     base.OnMouseDown(e); 
     timer.Start(); 
    } 

    protected virtual void OnDepressed() 
    { 
     var handler = this.Depressed; 

     if (handler != null) 
      handler(this, EventArgs.Empty); 
    } 
} 

這使你的代碼是異步的,但也是Depressed事件將在UI線程仍然被調用。

0

謝謝大家,這是關於儘可能簡單,因爲我可以得到它。 按鈕和鼠標控件混合了togather,需要鼠標處理......它被添加到按鈕屬性中,這會將代碼添加到設計器中。

private void button2_MouseDown(object sender, MouseEventArgs e) 
{ 
    led18.Show(); 
} 

private void button2_MouseUp(object sender, MouseEventArgs e) 
{ 
    led18.Hide(); 
} 

//below get automatically put into the design file... 

this.button1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.button1_MouseDown); 
this.button1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.button1_MouseUp);