C#跳棋程序如何管理面板数组点击事件并自动恢复旧面板状态
问题根因
你遇到的clicked_squares.Count永远为1的核心原因是:你将clicked_squares定义为了Checkerpiece类的非静态实例成员。每生成一个棋子实例就会独立持有一份clicked_squares列表,点击不同棋子时元素只会存入当前实例自己的列表中,所有列表数据完全不共享,自然每次打印长度都是1。
解决方案
不需要用List存储,同一时间最多只有1个选中的面板,直接用静态变量存储当前选中的实例即可,逻辑更简单高效,修改方案如下:
第一步:修改Checkerpiece类代码
public class Checkerpiece { // 静态字段,所有棋子实例共享,存储当前处于选中状态的棋子 private static Checkerpiece _currentSelected; // 实例字段,存储当前棋子对应面板的原始背景色 private Color _originalPanelBackColor; // 存储棋子原始颜色 Color color; Panel target_square; float center_x; float center_y; float radii; public Checkerpiece(Panel mypanel,Color color) { this.color = color; this.target_square = mypanel; this.center_x = mypanel.Width / 2; this.center_y = mypanel.Height / 2; this.radii = mypanel.Width / 2; // 初始化时保存面板原始背景色 _originalPanelBackColor = mypanel.BackColor; this.target_square.Click += Target_square_Click; } private void Target_square_Click(object sender, EventArgs e) { // 先处理上一个选中的棋子 if (_currentSelected != null) { // 恢复上一个选中面板的原始背景色 _currentSelected.target_square.BackColor = _currentSelected._originalPanelBackColor; // 重绘上一个棋子为原始颜色 _currentSelected.Draw(); // 如果点击的就是当前已选中的棋子,直接取消选中后返回 if (_currentSelected == this) { _currentSelected = null; return; } } // 设置当前棋子为选中状态 this.target_square.BackColor = Color.Blue; // 重绘当前棋子为白色(Draw方法新增isSelected参数判断颜色) this.Draw(isSelected: true); // 更新当前选中的实例 _currentSelected = this; } // 调整原有的Draw方法,增加是否选中的参数 public void Draw(bool isSelected = false) { using (var g = target_square.CreateGraphics()) { var brush = isSelected ? Brushes.White : new SolidBrush(color); fillCircle(g, brush, center_x, center_y, radii); } } public static void fillCircle(Graphics g, Brush b, float centerX, float centerY, float radius) { g.FillEllipse(b, centerX - radius, centerY - radius, radius + radius, radius + radius); } public Color getCheckerColor() { return this.color; } }
逻辑说明
- 静态变量
_currentSelected全局唯一,所有棋子共享同一份选中状态存储 - 每次点击棋子时,先自动恢复上一个选中面板的样式,再处理当前点击的棋子
- 如果点击的是已选中的棋子,直接取消选中,实现再次点击还原的效果
运行效果
调整后同一时间只会有一个面板处于选中状态,点击新面板时上一个选中面板会自动恢复原始样式,符合预期。
内容的提问来源于stack exchange,提问作者user16612111
相关产品推荐
相关产品推荐

