WinForms C#动态按钮替换MousePosition坐标问题求助
解决方案
核心思路是用**字典(Dictionary)**替代两个独立列表,让每个动态按钮和它对应的坐标一一绑定,这样就能实现点击按钮拖动后更新对应坐标,而不是重复添加。
步骤1:替换原有列表为字典
把原来的xInput和yInput两个列表,换成一个字典变量,用来存储按钮与对应坐标的映射关系:
// 声明在类内部,与原xInput、yInput变量同级 private Dictionary<Button, Point> buttonCoordinates = new Dictionary<Button, Point>();
步骤2:修改MouseUp事件逻辑
在addBtn_Up方法里,先获取当前操作的按钮实例,然后直接更新字典中该按钮对应的坐标——如果是第一次拖动,自动添加新条目;如果是重复拖动,则覆盖旧坐标:
private void addBtn_Up(object sender, MouseEventArgs e) { Button targetBtn = sender as Button; if (targetBtn == null) return; int xMouse = MousePosition.X; int yMouse = MousePosition.Y; // 更新或添加按钮对应的坐标 buttonCoordinates[targetBtn] = new Point(xMouse, yMouse); Cursor = DefaultCursor; }
步骤3:修改批量点击逻辑
在button5_Click方法里,遍历字典中的所有坐标值,依次执行点击操作:
private async void button5_Click(object sender, EventArgs e) { foreach (Point coord in buttonCoordinates.Values) { ClickAtClass.ClickAt(coord.X, coord.Y); await Task.Delay(1000); } }
额外说明
- 动态创建按钮的
button6_Click方法无需修改,新按钮绑定事件后,拖动时会自动触发addBtn_Up,字典会自动完成按钮与坐标的关联。 - 如果需要严格保留按钮的创建顺序,可以改用
OrderedDictionary,或者结合List<Button>记录按钮创建顺序,遍历的时候按列表顺序从字典中取对应坐标。
内容的提问来源于stack exchange,提问作者Yordan Voyvode
相关产品推荐
相关产品推荐

