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
相关产品推荐
相关产品推荐

