我整天都在尝试,并查找了各种各样的想法......没有真正的帮助。 当我按下一个按钮,如“JOG”,这将连续移动CNC机床轴,只要按下按钮,然后释放时,它将停止。
为了测试这个,我正在使用“picuture / LED”,当我按住时,应该打开...当我发布时,它应该关闭。
按下按钮应该=仅在按下时执行操作。 释放相同的按钮=停止做你现在做的任何事情。
我相信你们先进的人,这可能是101 ...但对我来说......它正在吃我的午餐......帮忙?
答案 0 :(得分:4)
您可以使用MouseDown
和MouseUp
个活动。当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();
}