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

C# Windows Forms如何根据选择在窗体间传递变量?

Windows Forms窗体间变量传递实现方案

针对你的需求,下面几种方法可以实现窗体间的变量传递,避免重复创建窗体:

1. 构造函数传参(推荐用于初始化场景)

在游戏主窗体(FormMain)中定义带参数的构造函数,创建窗体时直接把关卡号、道具信息传进去,适合初始化时一次性传递固定参数的场景。

实现步骤:

  • 在FormMain中添加带参数的构造函数(保留默认构造函数供设计器使用):
public class FormMain : Form
{
    private int _selectedLevel;
    private List<string> _playerItems;

    // 带参数的构造函数,用于接收关卡和道具
    public FormMain(int level, List<string> items)
    {
        InitializeComponent();
        _selectedLevel = level;
        _playerItems = items;

        // 立即根据参数初始化游戏逻辑
        InitEnemiesByLevel();
        ApplyPlayerItems();
    }

    // 默认构造函数,设计器必需,不可删除
    public FormMain()
    {
        InitializeComponent();
    }

    // 根据关卡初始化敌人参数
    private void InitEnemiesByLevel()
    {
        switch (_selectedLevel)
        {
            case 1:
                // 设置1级敌人的血量、攻击力等属性
                break;
            case 2:
                // 设置2级敌人的难度参数
                break;
            // 其他关卡逻辑依次补充
        }
    }

    // 应用道具效果
    private void ApplyPlayerItems()
    {
        foreach (var item in _playerItems)
        {
            if (item == "攻击力加成")
            {
                // 提升玩家攻击力
            }
            else if (item == "血量回复")
            {
                // 回复玩家初始血量
            }
        }
    }
}
  • 在关卡选择页打开FormMain时传递关卡参数:
// 假设用户选择了关卡3,暂未携带道具
int selectedLevel = 3;
List<string> emptyItems = new List<string>();

FormMain formMain = new FormMain(selectedLevel, emptyItems);
formMain.Show();
this.Hide();
  • 在道具商店页打开FormMain时传递道具+关卡参数:
// 假设用户购买了两个道具,且已选定关卡2
List<string> boughtItems = new List<string> { "攻击力加成", "护盾" };
int targetLevel = 2;

FormMain formMain = new FormMain(targetLevel, boughtItems);
formMain.Show();
this.Hide();

2. 属性/字段传参(适合灵活修改参数)

如果需要在创建窗体后动态调整参数,或者参数可能在多个步骤中确定,可以给FormMain添加公开属性,在窗体显示前或显示后设置。

实现步骤:

  • 在FormMain中定义公开属性:
public class FormMain : Form
{
    public int SelectedLevel { get; set; }
    public List<string> PlayerItems { get; set; } = new List<string>();

    public FormMain()
    {
        InitializeComponent();
        // 绑定窗体加载事件,在加载时处理参数
        this.Load += FormMain_Load;
    }

    private void FormMain_Load(object sender, EventArgs e)
    {
        if (SelectedLevel > 0)
        {
            InitEnemiesByLevel(SelectedLevel);
        }
        if (PlayerItems.Any())
        {
            ApplyPlayerItems(PlayerItems);
        }
    }

    // 省略InitEnemiesByLevel和ApplyPlayerItems方法(同构造函数示例)
}
  • 调用时先创建窗体,再设置属性:
FormMain formMain = new FormMain();
formMain.SelectedLevel = 4;
formMain.PlayerItems.Add("暴击药水");
formMain.Show();
this.Hide();

3. 静态类共享全局数据(适合多窗体共享状态)

如果多个窗体都需要访问或修改同一个数据(比如玩家当前的道具、已解锁关卡),可以用静态类存储全局状态,适合跨多个窗体共享数据的场景。

实现步骤:

  • 创建静态存储类:
public static class GameGlobalData
{
    public static int CurrentLevel { get; set; }
    public static List<string> PlayerInventory { get; set; } = new List<string>();
}
  • 在关卡选择页设置关卡:
GameGlobalData.CurrentLevel = 5;
FormMain formMain = new FormMain();
formMain.Show();
this.Hide();
  • 在道具商店页添加道具:
GameGlobalData.PlayerInventory.Add("无敌药水");
FormMain formMain = new FormMain();
formMain.Show();
this.Hide();
  • 在FormMain中直接读取全局数据:
private void FormMain_Load(object sender, EventArgs e)
{
    int level = GameGlobalData.CurrentLevel;
    var items = GameGlobalData.PlayerInventory;
    InitEnemiesByLevel(level);
    ApplyPlayerItems(items);
}

注意事项:

  • 静态类的数据是全局持久的,关闭窗体后不会自动清空,需要在合适的时机(比如回到欢迎页、游戏结束)手动重置数据。
  • 单线程小游戏场景无需考虑线程安全,多线程场景需额外加锁处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:45:32