在我的一个课程中,我得到了List<Point> mousePointList = clickArea.getClicks();
函数getClicks()应返回一个点列表,其中包含执行该函数后每次单击的条目。单击多次后,您应该可以通过单击ENTER完成该功能。
我的问题是我无法获得等待MouseClick功能的功能。
答案 0 :(得分:1)
我认为你的逻辑错了。您不能等待鼠标点击,而是会收到一个事件(通过Form
MouseClick
事件左右),您将采取相应行动。
您可以对ENTER
执行相同的操作:如果有人点击ENTER
并且您尚未允许,请不要再处理该事件。您可以使用KeyDown
事件。
答案 1 :(得分:0)
您不想等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来处理删除事件处理程序并再次启用该按钮。