如何从ColorChoice窗体修改PlayingField中pnlPlayer的BackColor属性
问题原因
pnlPlayer是PlayingField窗体的私有控件,默认仅可在PlayingField类内部访问,你在ColorChoice类中直接调用pnlPlayer自然会触发上下文不存在的报错。- 你在确认按钮点击事件中每次都
new PlayingField()创建新的游戏窗口,就算能修改控件属性,也只会作用到新创建的窗口上,不会修改你已经打开的原有游戏窗口。 - ComboBox的选中索引从0开始计数,你当前代码中case从1开始匹配,会导致第一个选项(Red)无法触发赋值逻辑。
解决步骤
第一步:在PlayingField中暴露修改玩家控件颜色的公共接口
不要直接将pnlPlayer的访问修饰符改为public,通过公共属性封装更符合开发规范,在PlayingField.cs中添加如下代码:
// 请将该属性添加到PlayingField类内部 public Color PlayerPanelColor { get => pnlPlayer.BackColor; set => pnlPlayer.BackColor = value; }
第二步:将原有PlayingField实例传递给ColorChoice
你从哪个PlayingField窗口打开的ColorChoice,就把这个窗口的实例传给ColorChoice,不用每次点确认都新建游戏窗口:
- 先修改PlayingField中打开ColorChoice的代码,给ColorChoice指定所有者:
// PlayingField中打开颜色选择窗口的逻辑 ColorChoice colorForm = new ColorChoice(); colorForm.Owner = this; // 将当前游戏窗口设为颜色选择窗口的所有者 colorForm.Show();
- 改写ColorChoice的确认点击事件逻辑,通过Owner获取原有游戏窗口实例进行修改:
public void ColorConfirm_Click(object sender, EventArgs e) { // 校验所有者为PlayingField类型 if (this.Owner is PlayingField existingPF) { // 注意索引从0开始匹配 switch (ColorComboBox.SelectedIndex) { case 0: existingPF.PlayerPanelColor = Color.Red; break; case 1: existingPF.PlayerPanelColor = Color.Blue; break; case 2: existingPF.PlayerPanelColor = Color.Green; break; case 3: existingPF.PlayerPanelColor = Color.Black; break; } } // 可选:选完颜色后关闭颜色选择窗口 this.Close(); }
额外注意项
如果你的ColorComboBox是动态创建的控件,请把ColorChoice_Load方法中//ComboBox ColorComboBox = new ComboBox();的注释去掉,否则会触发空引用异常。
内容的提问来源于stack exchange,提问作者user17187088
相关产品推荐
相关产品推荐

