【问题标题】:picture box only displays once图片框只显示一次
【发布时间】:2017-11-30 09:40:49
【问题描述】:

我将图片框创建为一个对象,一个容器保存所有对象。因此,如果需要,我调用使用 generateIcon 的 returnIcon 方法。我在容器中有一个方法来搜索正确的对象,然后返回该对象的图标。表单创建容器。我在那里调用图标,然后将它们发送到要显示它的用户控件。我的问题是图片框只显示最后一次调用。我知道每个对象都被正确找到。在用户控件中,我使用了picturebox.name,每一个都是正确的。正在发送值,但未显示图像。为什么只有最后一个图片框调用显示?

基础对象是基本的 LeagueObject,其中包含在需要时创建的图片框(取决于布尔 iamset)。

容器基本上只是一个 LeagueObjects 的列表(它是为 JSON 反序列化而设置的)。

图片框旅行: 联盟(基础)对象>>容器>>表单>>加载到表单中的用户控件(有十个用户控件添加到表单中)唯一显示的图片框是最后需要图片框的用户控件。

- base object

        Protected Sub generateIcon()
            If Not iamset Then
                img.Width = 45
                img.Height = 45
                img.SizeMode = PictureBoxSizeMode.Zoom
                img.BorderStyle = BorderStyle.None
                Try
                    img.Image = System.Drawing.Image.FromFile(Path.Combine(Path.GetTempPath(), "lolIcons", type, image.full))
                Catch ex As Exception
                End Try
                img.BackColor = Color.White
                setIcon()
                AddHandler img.Click, AddressOf onIconClick
                iamset = True
            End If
        End Sub
            Public Function returnIcon() As PictureBox
                generateIcon()
                Return img
            End Function

    - base object collection    


      Public Function returnImageById(ByVal strID As String) As PictureBox
                For Each champ In league_container.data
                    If champ.Value.id.ToString = strID Then
                        Console.WriteLine("found " + champ.Value.name)
                        Return champ.Value.returnIcon()
                    End If
                Next
                Console.WriteLine("Failed to find " + strID)
                Return New PictureBox
            End Function

- form

    Public Sub loadUC(ByVal player As LeagueCurrentGameParticipant, ByVal kills As Double, ByVal deaths As Double, ByVal assists As Double, ByVal largestKillingSpree As Double, ByVal largestMultiKill As Double, ByVal killingSprees As Double, ByVal doubleKills As Double, ByVal tripleKills As Double, ByVal quadraKills As Double, ByVal pentaKills As Double, ByVal unRealKills As Double)
            Dim uc As New ucMatchSummoner
            uc.loadUC(player, rgocm.returnImageById(player.championId.ToString), rgossm.returnImageById(player.spell1Id.ToString()), rgossm.returnImageById(player.spell2Id.ToString()), kills, deaths, assists, largestKillingSpree, largestMultiKill, killingSprees, doubleKills, tripleKills, quadraKills, pentaKills, unRealKills)
            tblpMain.Controls.Add(uc)
        End Sub

- user control (This one is actually longer but I truncated it since it served no purpose. I was sending it ByVal but attempted ByRef in case anything changed, which it did not.

      Public Sub loadUC(ByRef lcgp As LeagueCurrentGameParticipant, ByVal champImage As PictureBox, ByRef spell1 As PictureBox, ByRef spell2 As PictureBox, ByVal kills As Double, ByVal deaths As Double, ByVal assists As Double, ByVal largestKillingSpree As Double, ByVal largestMultiKill As Double, ByVal killingSprees As Double, ByVal doubleKills As Double, ByVal tripleKills As Double, ByVal quadraKills As Double, ByVal pentaKills As Double, ByVal unRealKills As Double)
            lp = lcgp
            loadPlayerCurrentGameInformation()
            pnlChampIcon.Controls.Add(champImage)
            flpSpells.Controls.Add(spell1)
            flpSpells.Controls.Add(spell2)
    End class

【问题讨论】:

  • 您可能需要花一些时间进行更好的解释。对象、基础对象、基础对象集合包含所有对象的容器等术语使其含糊不清且难以理解。 “容器”是指UserControl吗?看起来你正在(重新)在用户控件中创建一个图片框?为什么?您无需重新创建控件即可显示不同的图像。
  • LeagueObject 只是一个带有一些信息的基本对象。该容器是一个包含一些附加信息的 LeagueObjects 列表。您可以将其视为具有每个对象的图片框属性的对象列表。我只使用了controls.add(PictureBox),我不认为我在重新创建任何东西。我不想发布对象的所有代码,因为它很多。
  • 我还编辑了这个问题,试图澄清我的问题。
  • 如果您将新的类项分配给现有的 UserControl ,那么 iamset = True 标志应该会阻止显示 first 图像以外的任何图像。在类对象而不是 userControl 中实现 PictureBox 似乎非常奇怪。 PB 是用户视图,而不是代码/类类型的东西。
  • 所有关于如何构建图片框的信息都集中在一个位置,这样就更容易了,而不必在表单上手动实例化。该集合是使用包含文件路径的 json 字符串创建的。我想我可以找到另一种方法在表单上而不是在课堂上实例化它。为什么 iamset 标志会阻止显示任何其他图像?我想如果我返回一个创建的图像,它可以再次返回它。

标签: vb.net image picturebox


【解决方案1】:

显然,图片框不能像字符串一样反复返回。因此,我可以多次快速创建图像。该标志的主要原因是因为我每次都在下载图像,现在我只是将一组图像保存在一个临时文件夹中并访问那里的图像,这很有效。标志 iAmSet 会阻止图片框被多次创建,所以我删除了标志,一切都按预期工作。

【讨论】:

  • 不,问题是图像分配在If iamset 检查内。对于像位置这样的 PB,有些东西可能只需要设置一次,但如果您想要更改图像,则不需要设置。如果使用图片框作为数据存储元素当然不是最理想的。
  • 我不希望图像改变。例如,我有治疗、传送和闪光。每个都有自己的图标(图像)。我必须为多个玩家多次使用这三个图标。 JSON 字符串包含这三个咒语的所有数据,我将其反序列化为对象。我想我们选择这种方式的原因是我们只需更改一个图片框即可将它们全部更改。我想我们可以创建一个类 NewPictureBox,然后使用图像进入我们的 NewPictureBox。我只是喜欢有一门课可以做我需要的一切。它还有更多的代码。
  • 如果我说的还不够,我要谢谢你。你一直是这个网站上最有帮助的人,我非常感谢你给我的所有建议。我很快就要毕业了,但这一切都是我的一个单独的个人项目。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多