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

C# Enigma模拟器:如何根据用户输入切换PictureBox可见性?

实现Enigma模拟器灯板的PictureBox状态切换

嘿,这个灯板的实现思路挺合理的!我之前做Enigma模拟的时候也用过类似的控件布局,给你分享几个具体的实现方法,让状态切换更顺畅:

第一步:给PictureBox控件做好标识

为了快速找到对应字母的两个PictureBox,建议给它们做清晰的命名或者标记:

  • 命名规则:比如灰色字母控件叫pbGray_A、pbGray_B...pbGray_Z,黄色字母控件叫pbYellow_A、pbYellow_B...pbYellow_Z
  • 或者用Tag属性:给每个PictureBox的Tag赋值对应的字母(比如'A'、'B'),这样不用严格依赖命名

第二步:初始化灯板状态

在窗体加载的时候,先把所有黄色字母的PictureBox设为隐藏,灰色的设为可见:

private void Form_Load(object sender, EventArgs e)
{
    // 遍历所有灰色PictureBox并显示
    foreach (Control ctrl in this.Controls)
    {
        if (ctrl is PictureBox pb && ctrl.Name.StartsWith("pbGray_"))
        {
            pb.Visible = true;
        }
        // 遍历所有黄色PictureBox并隐藏
        else if (ctrl is PictureBox pbYellow && ctrl.Name.StartsWith("pbYellow_"))
        {
            pbYellow.Visible = false;
        }
    }
}

第三步:处理解码后的字母,切换控件可见性

当Enigma返回解码后的字母时,写一个专门的方法来更新灯板:

方法1:通过控件名称查找(简单直接)

private void UpdateLampboard(char decodedLetter)
{
    // 把字母转为大写,避免大小写问题
    char targetLetter = char.ToUpper(decodedLetter);
    
    // 找到对应灰色和黄色的PictureBox
    PictureBox grayBox = this.Controls.Find($"pbGray_{targetLetter}", true).FirstOrDefault() as PictureBox;
    PictureBox yellowBox = this.Controls.Find($"pbYellow_{targetLetter}", true).FirstOrDefault() as PictureBox;
    
    if (grayBox != null && yellowBox != null)
    {
        // 隐藏灰色,显示黄色
        grayBox.Visible = false;
        yellowBox.Visible = true;
        
        // 如果需要每次只亮当前字母(之前的熄灭),可以先把所有黄色控件隐藏:
        // ResetAllYellowBoxes();
        // yellowBox.Visible = true;
    }
}

// 可选:重置所有灯到初始状态的方法
private void ResetAllYellowBoxes()
{
    foreach (Control ctrl in this.Controls)
    {
        if (ctrl is PictureBox pb && ctrl.Name.StartsWith("pbYellow_"))
        {
            pb.Visible = false;
            // 同时把对应灰色的显示回来
            PictureBox grayBox = this.Controls.Find($"pbGray_{ctrl.Name.Split('_')[1]}", true).FirstOrDefault() as PictureBox;
            if (grayBox != null) grayBox.Visible = true;
        }
    }
}

方法2:用控件数组存储(更高效)

如果觉得每次查找控件效率不高,可以在初始化的时候把所有PictureBox存入数组,按字母顺序对应:

private PictureBox[] _grayBoxes = new PictureBox[26];
private PictureBox[] _yellowBoxes = new PictureBox[26];

private void Form_Load(object sender, EventArgs e)
{
    // 初始化数组
    for (int i = 0; i < 26; i++)
    {
        char letter = (char)('A' + i);
        _grayBoxes[i] = this.Controls.Find($"pbGray_{letter}", true).FirstOrDefault() as PictureBox;
        _yellowBoxes[i] = this.Controls.Find($"pbYellow_{letter}", true).FirstOrDefault() as PictureBox;
        
        // 设置初始状态
        if (_grayBoxes[i] != null) _grayBoxes[i].Visible = true;
        if (_yellowBoxes[i] != null) _yellowBoxes[i].Visible = false;
    }
}

private void UpdateLampboard(char decodedLetter)
{
    int index = char.ToUpper(decodedLetter) - 'A';
    if (index >= 0 && index < 26)
    {
        if (_grayBoxes[index] != null) _grayBoxes[index].Visible = false;
        if (_yellowBoxes[index] != null) _yellowBoxes[index].Visible = true;
        
        // 同样,如果需要重置所有灯,调用ResetAllYellowBoxes即可
    }
}

第四步:关联用户输入与灯板更新

在用户输入字母的处理逻辑里(比如键盘按键事件、按钮点击事件),调用Enigma解码后,再调用UpdateLampboard方法:

private void OnUserInput(char inputLetter)
{
    // 调用你的Enigma解码逻辑,得到返回字母
    char decodedLetter = YourEnigmaInstance.Decode(inputLetter);
    
    // 更新灯板
    UpdateLampboard(decodedLetter);
}

这样就能实现输入后对应字母的黄色灯点亮、灰色灯隐藏的效果啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:02:01