只要我按下按钮,如何让winform按钮“做某事”?

时间:2014-01-15 20:00:45

标签: c# visual-studio button

我整天都在尝试,并查找了各种各样的想法......没有真正的帮助。 当我按下一个按钮,如“JOG”,这将连续移动CNC机床轴,只要按下按钮,然后释放时,它将停止。

为了测试这个,我正在使用“picuture / LED”,当我按住时,应该打开...当我发布时,它应该关闭。

按下按钮应该=仅在按下时执行操作。 释放相同的按钮=停止做你现在做的任何事情。

我相信你们先进的人,这可能是101 ...但对我来说......它正在吃我的午餐......帮忙?

5 个答案:

答案 0 :(得分:4)

您可以使用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或类似的东西在另一个线程上运行它。

答案 1 :(得分:2)

一般来说,看一下鼠标上下的事件。当鼠标关闭时,我会让它异步调用一些函数(不在UI线程上)。当鼠标向上事件触发时停止它。 System.Threading有一些很好的模型。在那里尝试谷歌搜索。

您希望启动和停止程序循环执行操作的线程。

答案 2 :(得分: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);
    }
}

这允许您的代码是异步的,但是仍会在UI线程上调用Depressed事件。

答案 3 :(得分: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); 

答案 4 :(得分:0)

考虑空格键也可以上下触发按钮。

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

this.button1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.button1_KeyDown);
this.button1.KeyUp += new System.Windows.Forms.KeyEventHandler(this.button1_KeyUp);

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

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

private void button1_KeyDown(object sender, KeyEventArgs e)
{
    if(e.KeyCode == Keys.Space && e.Alt==false && e.Control==false && e.Shift==false)
    {
        led18.Show();
    }
}
private void button1_KeyUp(object sender, KeyEventArgs e)
{
    led18.Hide();  
}