如何获取PictureBox中图片资源名称,解决My.Settings存储Image转String报错
问题原因
你遇到的报错是因为My.Settings中stg_slotXX字段的类型为String,你直接将Image对象赋值给String类型字段,触发了类型转换错误。你需要将图片对应的唯一标识(资源名/类型ID)存入设置,而非直接存Image对象。
解决方案步骤
步骤1:为方块控件绑定资源标识
你可以在给Pb_BlockSpace001等控件赋值Image的同时,将对应资源的名称存入控件的Tag属性,作为唯一标识:
' 示例:初始化方块为草方块时的赋值逻辑 Pb_BlockSpace001.Image = My.Resources.Grass Pb_BlockSpace001.Tag = "Grass" ' 和资源管理器中的资源名称完全一致
如果你的方块类型较多,更推荐定义枚举来管理,避免资源名拼写错误:
' 定义方块类型枚举 Public Enum BlockType Empty = 0 Grass = 1 Stone = 2 Wood = 3 End Enum ' 赋值时存入枚举值 Pb_BlockSpace001.Image = My.Resources.Grass Pb_BlockSpace001.Tag = BlockType.Grass
步骤2:修改保存代码
将原来直接赋值Image的逻辑改为存储Tag中的标识:
Private Sub Menu_Save_Click(sender As Object, e As EventArgs) Handles Menu_Save.Click Dg_1 = MessageBox.Show("Are you sure you want to save? This will overwrite your previous save.", "Warning!", MessageBoxButtons.YesNo) If (Dg_1) = DialogResult.Yes Then If (Generated = 0) Then Tb_Chat.Text += Environment.NewLine Tb_Chat.Text += "Cannot save a blank world" ElseIf Generated = 1 Then My.Settings.savslot1_isused = True My.Settings.savslot1_hearts = Hp My.Settings.savslot1_hunger = Hunger ' 存储资源标识而非Image对象 My.Settings.stg_slot01 = Pb_BlockSpace001.Tag?.ToString() ?? "" My.Settings.stg_slot02 = Pb_BlockSpace002.Tag?.ToString() ?? "" My.Settings.stg_slot03 = Pb_BlockSpace003.Tag?.ToString() ?? "" My.Settings.stg_slot04 = Pb_BlockSpace004.Tag?.ToString() ?? "" My.Settings.stg_slot05 = Pb_BlockSpace005.Tag?.ToString() ?? "" ' 不要忘记调用Save方法持久化设置 My.Settings.Save() Tb_Chat.Text += Environment.NewLine Tb_Chat.Text += "World Saved. " + TimeOfDay + "." Else Exit Sub End If End If End Sub
注意:不要遗漏My.Settings.Save()调用,否则设置不会持久化到本地。
步骤3:补充读档对应逻辑
读档时通过存储的标识获取对应Image:
' 示例读档逻辑,根据存储的资源名获取图片 Dim blockResName = My.Settings.stg_slot01 If Not String.IsNullOrEmpty(blockResName) Then Pb_BlockSpace001.Image = DirectCast(My.Resources.ResourceManager.GetObject(blockResName), Image) Pb_BlockSpace001.Tag = blockResName Else Pb_BlockSpace001.Image = Nothing Pb_BlockSpace001.Tag = BlockType.Empty End If
优化建议
- 尽量不要直接存储资源名称,如果后续你修改了资源文件中的图片命名,旧存档会全部失效。推荐使用枚举值作为存储内容,读档时通过枚举匹配对应图片,稳定性更高。
- 如果后续方块数量增多,不要单独给每个slot写存储逻辑,可以把所有方块控件存入数组,循环读写,减少冗余代码。
内容的提问来源于stack exchange,提问作者ridhomblr
相关产品推荐
相关产品推荐

