C# 如何制作winform按钮;“做点什么”;只要我按下按钮?

C# 如何制作winform按钮;“做点什么”;只要我按下按钮?,c#,visual-studio,button,C#,Visual Studio,Button,我试了一整天,找到了各种各样的想法。。。没有真正的帮助。 当我按下一个按钮,比如“JOG”,它会连续移动数控机床的轴,只要按下按钮,然后松开,它就会停止 为了测试这一点,我使用了一个“Picture/LED”,当我按住它时,它应该是打开的。。。当我释放时,它应该关闭 按下按钮应=仅在按下时,执行操作。 释放同一按钮=停止你现在正在做的事情 我相信你们这些先进的人,这可能是101。。。但对我来说。。。它正在吃我的午餐。。。帮助?一般来说,请查看鼠标上下移动事件。我会让它在鼠标按下时异步调用某些函数

我试了一整天,找到了各种各样的想法。。。没有真正的帮助。 当我按下一个按钮,比如“JOG”,它会连续移动数控机床的轴,只要按下按钮,然后松开,它就会停止

为了测试这一点,我使用了一个“Picture/LED”,当我按住它时,它应该是打开的。。。当我释放时,它应该关闭

按下按钮应=仅在按下时,执行操作。 释放同一按钮=停止你现在正在做的事情


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

一般来说,请查看鼠标上下移动事件。我会让它在鼠标按下时异步调用某些函数(而不是在UI线程上)。当鼠标向上移动事件触发时停止。线程有一些很好的模型。试着在那里搜索一下

您希望启动和停止一个线程,该线程的过程正在循环执行您的操作。

您可以使用和事件。当点击
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
或类似的工具在另一个线程上运行它。

我会创建自己的子类,如下所示:

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线程上调用
按下的
事件。

谢谢大家,这是我所能做到的最简单的。 按钮和鼠标控制混合在一起,需要鼠标操作。。。它被添加到按钮属性中,将代码添加到设计器中

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); 

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

this.button1.MouseDown+=new System.Windows.Forms.MouseEventHandler(this.button1\u MouseDown);
this.button1.MouseUp+=新系统.Windows.Forms.MouseEventHandler(this.button1\u MouseUp);
this.button1.KeyDown+=新的System.Windows.Forms.KeyEventHandler(this.button1\u KeyDown);
this.button1.KeyUp+=新的System.Windows.Forms.KeyEventHandler(this.button1\u KeyUp);
私有无效按钮1\u鼠标向下(对象发送方,鼠标目标e)
{
led18.Show();
} 
专用无效按钮1\u鼠标(对象发送器,鼠标目标e)
{
led18.Hide();
}
私有void按钮1\u KeyDown(对象发送方,KeyEventArgs e)
{
if(e.KeyCode==Keys.Space&&e.Alt==false&&e.Control==false&&e.Shift==false)
{
led18.Show();
}
}
私有void按钮1\u KeyUp(对象发送方,KeyEventArgs e)
{
led18.Hide();
}

这是windows窗体上的一个按钮?类似这样的按钮?发布您当前的代码。您可能希望检查按钮\u MouseDown()事件及其同级MouseUp():是的,它位于windows窗体上。如果不执行线程,这可能会锁定您的UI。在这件事上要小心。否则是很好的解决方案。谢谢,。。。我将在需要此功能的按钮上尝试此鼠标代码。我会汇报我能做的事情。