等待鼠标点击功能
本文关键字:功能 鼠标 等待 | 更新日期: 2023-09-27 18:00:10
在我的一个班里,我得到了List<Point> mousePointList = clickArea.getClicks();
函数getClicks()应该返回一个点列表,其中包含执行该函数后每次单击的条目。单击多次后,您应该能够通过按ENTER键来完成该功能。
我的问题是,我无法获得等待鼠标点击功能的函数。
我认为你的逻辑错了。你不能等待鼠标点击,相反,你只会收到一个事件(通过你的Form
的MouseClick
事件左右),你会采取相应的行动。
你可以对ENTER
做同样的事情:如果有人点击ENTER
,而你还不允许,就不要再处理这个事件了。您可以为此使用KeyDown
事件。
您不想等待MouseClick
。你想做的是从你的功能内部连接一个延续:
void Main()
{
Form frm = new Form();
var btn = new Button { Text = "Start" };
btn.Click += (_, __) =>
{
var clicks = new List<Point>();
MouseEventHandler mouseUp = (s, e) =>
{
clicks.Add(e.Location);
};
var eventHelper = new EventHelper { MouseUp = mouseUp };
KeyEventHandler keyUp = (s, e) =>
{
if (e.KeyCode == Keys.Return)
{
frm.MouseUp -= eventHelper.MouseUp;
frm.KeyUp -= eventHelper.KeyUp;
btn.Enabled = true;
// Finish
clicks.Dump();
}
};
eventHelper.KeyUp = keyUp;
frm.MouseUp += mouseUp;
frm.KeyUp += keyUp;
btn.Enabled = false;
};
frm.Controls.Add(btn);
Application.Run(frm);
}
class EventHelper
{
public MouseEventHandler MouseUp;
public KeyEventHandler KeyUp;
}
请注意,clicks
变量保持为局部变量,不需要在整个表单上显式定义字段或类似的内容。注册和注销事件处理程序有点麻烦,但我希望这能足够清楚地表明意图。不过,不要忘记事件处理程序是全局的——如果有更多的按钮可能也在等待这些事件,它们将同时接收所有。这可能是个问题,也可能不是个问题,这取决于你的具体情况(但这是简单地拥有一个表单所固有的——除了在按下其中一个按钮时禁用所有冲突按钮之外,没有其他方法可以解决这个问题)。
使用await
也很容易避免手动编写回调-我将把它留给读者:)这对于可靠性来说非常方便-示例代码可以很容易地导致按钮永远被禁用,如果某个地方出现异常,也可以永远指定事件处理程序。对于await
,您只需使用try finally来处理删除事件处理程序并再次启用按钮的操作。