You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在2D按钮网格右侧固定放置暂停按钮?

解决暂停按钮位置偏移的问题

你的核心问题是计算暂停按钮X坐标时误用了行数而非列数,且依赖固定数值(42)导致适配性差。以下是具体修正方案:

关键修正点

  • 网格总宽度由列数 × 单个按钮宽度决定,而非行数
  • 暂停按钮的垂直位置需和网格第一行按钮对齐,确保处于"右上角"
  • 切换难度时需先清理旧的暂停按钮,避免重复创建

修改后的代码

1. 调整暂停按钮的位置计算逻辑

public void Generate_buttons()
{
    // 先移除旧的暂停按钮,避免切换难度时出现多个按钮
    var oldPauseBtn = _buttonForm.Controls.OfType<Button>().FirstOrDefault(b => b.Text == "Pause");
    if (oldPauseBtn != null)
    {
        _buttonForm.Controls.Remove(oldPauseBtn);
        oldPauseBtn.Dispose();
    }

    Button pause = new();
    // 计算网格总宽度:列数 × 单个按钮的实际宽度
    int gridTotalWidth = btnArray.GetLength(1) * btnArray[0, 0].Width;
    // 暂停按钮X位置对齐网格右侧,Y位置和第一行按钮保持一致
    pause.Left = gridTotalWidth;
    pause.Top = btnArray[0, 0].Top;

    pause.BackColor = Color.YellowGreen;
    pause.Text = "Pause";
    pause.Width = 130;
    pause.Height = 40;
    pause.AutoSize = true;
    pause.UseCompatibleTextRendering = true;
    pause.Margin = new(0);

    _buttonForm.Controls.Add(pause);
}

2. 错误原因说明

你之前用btnArray.GetLength(0)获取行数来计算X坐标,这是完全错误的——网格的横向宽度只和列数有关,应该用btnArray.GetLength(1)获取列数。同时用固定值42代替按钮实际宽度,会导致按钮尺寸调整后位置再次偏移。

额外优化建议

如果后续给网格按钮添加横向间距(比如Margin不为0),网格总宽度需要调整为:

int gridTotalWidth = btnArray.GetLength(1) * (btnArray[0, 0].Width + btnArray[0, 0].Margin.Horizontal);

这样能兼容带间距的网格布局,保证暂停按钮始终对齐网格右侧。

内容的提问来源于stack exchange,提问作者Erlend

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 02:13:10