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

如何获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:18:04