从多个动态图片框更改图像
Change the image from multiple dynamic picturebox
我正在用 VB.NET 创建一个包含状态图片的联系人列表。
我正在从 MSSQL 加载此列表,但当我重新加载列表时它会闪烁。
此列表是具有动态创建的图片框和标签的 TableLayoutPanel。
我的问题是:
当您重新加载我的联系人而不是重新加载整个列表时,我如何在动态图片框中更改我的图像。
我创建 table 的代码:
While UserData.Read
If UserData("Status").ToString = "Online" Then
If UserData("NieuwBericht").ToString = "Ja" Then
Dim newPictureBox As New PictureBox
newPictureBox.Image = My.Resources.greenchat
newPictureBox.Visible = True
newPictureBox.Width = 30
newPictureBox.Height = 30
newPictureBox.SizeMode = PictureBoxSizeMode.Zoom
newPictureBox.Name = UserData("Username").ToString
ChatContactList.Controls.Add(newPictureBox)
Dim newPictureBox2 As New PictureBox
newPictureBox2.Image = My.Resources.greenbubblechat
newPictureBox2.Visible = True
newPictureBox2.Width = 30
newPictureBox2.Height = 30
newPictureBox2.SizeMode = PictureBoxSizeMode.Zoom
newPictureBox2.Name = UserData("Username").ToString
ChatContactList.Controls.Add(newPictureBox2)
Dim newLabel As New Label
AddHandler newLabel.Click, AddressOf Chatbox
newLabel.Text = UserData("Voornaam").ToString & " " & UserData("Achternaam").ToString
newLabel.Name = UserData("Username").ToString
newLabel.Font = New Font("Microsoft sans serif", 12)
newLabel.Dock = DockStyle.Fill
newLabel.TextAlign = ContentAlignment.MiddleLeft
newLabel.Visible = True
ChatContactList.Controls.Add(newLabel)
ElseIf UserData("NieuwBericht").ToString = "Nee" Then
Dim newPictureBox As New PictureBox
newPictureBox.Image = My.Resources.greenchat
newPictureBox.Visible = True
newPictureBox.Width = 30
newPictureBox.Height = 30
newPictureBox.SizeMode = PictureBoxSizeMode.Zoom
newPictureBox.Name = UserData("Username").ToString
ChatContactList.Controls.Add(newPictureBox)
Dim newPictureBox2 As New PictureBox
newPictureBox2.Image = My.Resources.greybubblechat
newPictureBox2.Visible = True
newPictureBox2.Width = 30
newPictureBox2.Height = 30
newPictureBox2.SizeMode = PictureBoxSizeMode.Zoom
newPictureBox2.Name = UserData("Username").ToString
ChatContactList.Controls.Add(newPictureBox2)
Dim newLabel As New Label
AddHandler newLabel.Click, AddressOf Chatbox
newLabel.Text = UserData("Voornaam").ToString & " " & UserData("Achternaam").ToString
newLabel.Name = UserData("Username").ToString
newLabel.Font = New Font("Microsoft sans serif", 12)
newLabel.Dock = DockStyle.Fill
newLabel.TextAlign = ContentAlignment.MiddleLeft
newLabel.Visible = True
ChatContactList.Controls.Add(newLabel)
End If
ElseIf UserData("Status").ToString = "Afwezig" Then
If UserData("NieuwBericht").ToString = "Ja" Then
Dim newPictureBox As New PictureBox
newPictureBox.Image = My.Resources.orangechat
newPictureBox.Visible = True
newPictureBox.Width = 30
newPictureBox.Height = 30
newPictureBox.SizeMode = PictureBoxSizeMode.Zoom
newPictureBox.Name = UserData("Username").ToString
ChatContactList.Controls.Add(newPictureBox)
Dim newPictureBox2 As New PictureBox
newPictureBox2.Image = My.Resources.greenbubblechat
newPictureBox2.Visible = True
newPictureBox2.Width = 30
newPictureBox2.Height = 30
newPictureBox2.SizeMode = PictureBoxSizeMode.Zoom
newPictureBox2.Name = UserData("Username").ToString
ChatContactList.Controls.Add(newPictureBox2)
Dim newLabel As New Label
AddHandler newLabel.Click, AddressOf Chatbox
newLabel.Text = UserData("Voornaam").ToString & " " & UserData("Achternaam").ToString
newLabel.Name = UserData("Username").ToString
newLabel.Font = New Font("Microsoft sans serif", 12)
newLabel.Dock = DockStyle.Fill
newLabel.TextAlign = ContentAlignment.MiddleLeft
newLabel.Visible = True
ChatContactList.Controls.Add(newLabel)
ElseIf UserData("NieuwBericht").ToString = "Nee" Then
Dim newPictureBox As New PictureBox
newPictureBox.Image = My.Resources.orangechat
newPictureBox.Visible = True
newPictureBox.Width = 30
newPictureBox.Height = 30
newPictureBox.SizeMode = PictureBoxSizeMode.Zoom
newPictureBox.Name = UserData("Username").ToString
ChatContactList.Controls.Add(newPictureBox)
Dim newPictureBox2 As New PictureBox
newPictureBox2.Image = My.Resources.greybubblechat
newPictureBox2.Visible = True
newPictureBox2.Width = 30
newPictureBox2.Height = 30
newPictureBox2.SizeMode = PictureBoxSizeMode.Zoom
newPictureBox2.Name = UserData("Username").ToString
ChatContactList.Controls.Add(newPictureBox2)
Dim newLabel As New Label
AddHandler newLabel.Click, AddressOf Chatbox
newLabel.Text = UserData("Voornaam").ToString & " " & UserData("Achternaam").ToString
newLabel.Name = UserData("Username").ToString
newLabel.Font = New Font("Microsoft sans serif", 12)
newLabel.Dock = DockStyle.Fill
newLabel.TextAlign = ContentAlignment.MiddleLeft
newLabel.Visible = True
ChatContactList.Controls.Add(newLabel)
End If
ElseIf UserData("Status").ToString = "Offline" Then
If UserData("NieuwBericht").ToString = "Ja" Then
Dim newPictureBox As New PictureBox
newPictureBox.Image = My.Resources.redchat
newPictureBox.Visible = True
newPictureBox.Width = 30
newPictureBox.Height = 30
newPictureBox.SizeMode = PictureBoxSizeMode.Zoom
newPictureBox.Name = UserData("Username").ToString
ChatContactList.Controls.Add(newPictureBox)
Dim newPictureBox2 As New PictureBox
newPictureBox2.Image = My.Resources.greenbubblechat
newPictureBox2.Visible = True
newPictureBox2.Width = 30
newPictureBox2.Height = 30
newPictureBox2.SizeMode = PictureBoxSizeMode.Zoom
newPictureBox2.Name = UserData("Username").ToString
ChatContactList.Controls.Add(newPictureBox2)
Dim newLabel As New Label
AddHandler newLabel.Click, AddressOf Chatbox
newLabel.Text = UserData("Voornaam").ToString & " " & UserData("Achternaam").ToString
newLabel.Name = UserData("Username").ToString
newLabel.Font = New Font("Microsoft sans serif", 12)
newLabel.Dock = DockStyle.Fill
newLabel.TextAlign = ContentAlignment.MiddleLeft
newLabel.Visible = True
ChatContactList.Controls.Add(newLabel)
ElseIf UserData("NieuwBericht").ToString = "Nee" Then
Dim newPictureBox As New PictureBox
newPictureBox.Image = My.Resources.redchat
newPictureBox.Visible = True
newPictureBox.Width = 30
newPictureBox.Height = 30
newPictureBox.SizeMode = PictureBoxSizeMode.Zoom
newPictureBox.Name = UserData("Username").ToString
ChatContactList.Controls.Add(newPictureBox)
Dim newPictureBox2 As New PictureBox
newPictureBox2.Image = My.Resources.greybubblechat
newPictureBox2.Visible = True
newPictureBox2.Width = 30
newPictureBox2.Height = 30
newPictureBox2.SizeMode = PictureBoxSizeMode.Zoom
newPictureBox2.Name = UserData("Username").ToString
ChatContactList.Controls.Add(newPictureBox2)
Dim newLabel As New Label
AddHandler newLabel.Click, AddressOf Chatbox
newLabel.Text = UserData("Voornaam").ToString & " " & UserData("Achternaam").ToString
newLabel.Name = UserData("Username").ToString
newLabel.Font = New Font("Microsoft sans serif", 12)
newLabel.Dock = DockStyle.Fill
newLabel.TextAlign = ContentAlignment.MiddleLeft
newLabel.Visible = True
ChatContactList.Controls.Add(newLabel)
End If
End If
End While
我的联系人列表的图片
UserControl 有点像子窗体。它是各种控件的容器,这些控件共同作用或代表某个逻辑单元。在这种情况下,它将是某些用户状态(属性)的可视化表示。与其创建和管理 单独的控件 ,不如将它们放在一个 UC 上并封装 很多 代码来管理它们。
在 Solution Explorer window 中,右键单击 select Add,然后选择 用户控件。我添加了一个 TableLayoutPanel、2 个 PictureBoxes 和一个 Label(当然,所有这些都有正确的名称)。 还有一个ImageList
可以快速抓取你的图片:
这个 单独 替换了许多代码行,您必须创建新控件,然后一遍又一遍地设置相同的属性。为了使它们充当逻辑对象,您可以添加抽象 selecting 图像等细节的属性:
Public Class Chatter
Public Enum ChatStatus
Unknown
Online
Away
Offline
End Enum
Public Enum ChatMsgStatus
Undefined ' kludge to force the initial state
Unknown
[New]
Read
End Enum
' one set of images for all chatter instances
Private Shared Imgs As Image()
Public Property ChatId As Int32 ' or guid?
Private chName As String = ""
Public ReadOnly Property ChatName As String
Get
Return chName
End Get
End Property
Private mStatus As ChatMsgStatus = ChatMsgStatus.Undefined
Public Property MsgStatus As ChatMsgStatus
Get
Return mStatus
End Get
Set(value As ChatMsgStatus)
If (value <> mStatus) Then
Select Case value
Case ChatMsgStatus.New
pbMStatus.Image = Imgs(3)
Case ChatMsgStatus.Read
pbMStatus.Image = Imgs(4)
Case Else
pbMStatus.Image = Imgs(4)
End Select
End If
mStatus = value
End Set
End Property
Private chStatus As ChatStatus = ChatStatus.Unknown
Public Property Status As ChatStatus
Get
Return chStatus
End Get
Set(value As ChatStatus)
If value <> chStatus Then
Select Case value
Case ChatStatus.Online
pbUStatus.Image = Imgs(0)
Case ChatStatus.Away
pbUStatus.Image = Imgs(1)
Case ChatStatus.Offline
pbUStatus.Image = Imgs(2)
Case Else
End Select
End If
chStatus = value
End Set
End Property
Public Sub New()
' This call is required by the designer.
InitializeComponent()
If Imgs Is Nothing Then
Imgs = New Image() {My.Resources.ChatUserGrn, My.Resources.ChatUserYlw,
My.Resources.ChatUserRed, My.Resources.ChatBalloonGrn,
My.Resources.ChatBalloonGry}
' see note
End If
End If
' Add any initialization after the InitializeComponent() call.
End Sub
' no need to create one without Identifiers
Public Sub New(n As Int32, cname As String)
MyClass.New()
' default intitial values:
chName = cname
ChatId = n
lblChName.Text = cname
Me.Status = ChatStatus.Online
Me.MsgStatus = ChatMsgStatus.Unknown
End Sub
End Class
(编辑)我不喜欢使用 ImageList 的结果。此版本从资源中加载一组图像。除了仅加载一份 GreenUser 供所有用户使用外,它还允许您根据需要对其进行定制。例如,将背景颜色更改为 SystemColors.Window
以匹配用户的主题。如果您还使用标签而不是图片框,则可以使用 Text
属性 表示“?”甚至指明新消息的 数量 。
我确定它还有更多内容,我可以想到几件事 我 想让它知道(例如覆盖带有未读消息数量的绿色气球)。但这里的要点是 封装的概念 ,DRY 和可重用代码。
编译时,工具箱中会多出一个新的Chatter
控件。使用公开的属性在运行时添加一些:
Dim c As New Chatter(42, "Ziggy von Hausen")
flpChat.Controls.Add(c)
c = New Chatter(14, "ThDutoit")
c.MsgStatus = Chatter.ChatMsgStatus.New
flpChat.Controls.Add(c)
c = New Chatter(78, "Plutonix")
c.Status = Chatter.ChatStatus.Offline
flpChat.Controls.Add(c)
c = New Chatter(4, "Codexer")
c.MsgStatus = Chatter.ChatMsgStatus.New
c.Status = Chatter.ChatStatus.Away
flpChat.Controls.Add(c)
Id 将是唯一标识每个聊天参与者的东西。名称通常不够用(SO 已超过 50 pages of people named "Steve")并且您需要一种方法来识别 link 用户的控件。 (另一种方法是用户列表中的 ChatterBox
引用,它是对相关 UserControl
:
的引用
Dim user = "Codexer"
Dim chatter = flpChat.Controls.
OfType(Of Chatter).
FirstOrDefault(Function(c) c.ChatName.StartsWith(user))
If chatter IsNot Nothing Then
chatter.Status = chatter.ChatStatus.Online
End If
每次搜索都不是最优的,Id
比单纯的名字更好。理想的情况是 ChatUser
class 包含应用程序必须由用户存储的所有 other 内容。 class 应该包含对控件的引用,以便当状态发生变化或发生其他情况时,class 可以简单地:
myChatterBox.Status = myStatus
结果:
当然可以用相当少的代码创建它们。在事情的过程中,您可以通过设置相关的 属性.
来更改任一图像的状态
作为一个额外的好处,因为您不再创建单独的控件,并且因为 UserControl
继承自 Component
,您不必担心泄漏 if/when 这些已被删除。
我正在用 VB.NET 创建一个包含状态图片的联系人列表。 我正在从 MSSQL 加载此列表,但当我重新加载列表时它会闪烁。
此列表是具有动态创建的图片框和标签的 TableLayoutPanel。
我的问题是:
当您重新加载我的联系人而不是重新加载整个列表时,我如何在动态图片框中更改我的图像。
我创建 table 的代码:
While UserData.Read
If UserData("Status").ToString = "Online" Then
If UserData("NieuwBericht").ToString = "Ja" Then
Dim newPictureBox As New PictureBox
newPictureBox.Image = My.Resources.greenchat
newPictureBox.Visible = True
newPictureBox.Width = 30
newPictureBox.Height = 30
newPictureBox.SizeMode = PictureBoxSizeMode.Zoom
newPictureBox.Name = UserData("Username").ToString
ChatContactList.Controls.Add(newPictureBox)
Dim newPictureBox2 As New PictureBox
newPictureBox2.Image = My.Resources.greenbubblechat
newPictureBox2.Visible = True
newPictureBox2.Width = 30
newPictureBox2.Height = 30
newPictureBox2.SizeMode = PictureBoxSizeMode.Zoom
newPictureBox2.Name = UserData("Username").ToString
ChatContactList.Controls.Add(newPictureBox2)
Dim newLabel As New Label
AddHandler newLabel.Click, AddressOf Chatbox
newLabel.Text = UserData("Voornaam").ToString & " " & UserData("Achternaam").ToString
newLabel.Name = UserData("Username").ToString
newLabel.Font = New Font("Microsoft sans serif", 12)
newLabel.Dock = DockStyle.Fill
newLabel.TextAlign = ContentAlignment.MiddleLeft
newLabel.Visible = True
ChatContactList.Controls.Add(newLabel)
ElseIf UserData("NieuwBericht").ToString = "Nee" Then
Dim newPictureBox As New PictureBox
newPictureBox.Image = My.Resources.greenchat
newPictureBox.Visible = True
newPictureBox.Width = 30
newPictureBox.Height = 30
newPictureBox.SizeMode = PictureBoxSizeMode.Zoom
newPictureBox.Name = UserData("Username").ToString
ChatContactList.Controls.Add(newPictureBox)
Dim newPictureBox2 As New PictureBox
newPictureBox2.Image = My.Resources.greybubblechat
newPictureBox2.Visible = True
newPictureBox2.Width = 30
newPictureBox2.Height = 30
newPictureBox2.SizeMode = PictureBoxSizeMode.Zoom
newPictureBox2.Name = UserData("Username").ToString
ChatContactList.Controls.Add(newPictureBox2)
Dim newLabel As New Label
AddHandler newLabel.Click, AddressOf Chatbox
newLabel.Text = UserData("Voornaam").ToString & " " & UserData("Achternaam").ToString
newLabel.Name = UserData("Username").ToString
newLabel.Font = New Font("Microsoft sans serif", 12)
newLabel.Dock = DockStyle.Fill
newLabel.TextAlign = ContentAlignment.MiddleLeft
newLabel.Visible = True
ChatContactList.Controls.Add(newLabel)
End If
ElseIf UserData("Status").ToString = "Afwezig" Then
If UserData("NieuwBericht").ToString = "Ja" Then
Dim newPictureBox As New PictureBox
newPictureBox.Image = My.Resources.orangechat
newPictureBox.Visible = True
newPictureBox.Width = 30
newPictureBox.Height = 30
newPictureBox.SizeMode = PictureBoxSizeMode.Zoom
newPictureBox.Name = UserData("Username").ToString
ChatContactList.Controls.Add(newPictureBox)
Dim newPictureBox2 As New PictureBox
newPictureBox2.Image = My.Resources.greenbubblechat
newPictureBox2.Visible = True
newPictureBox2.Width = 30
newPictureBox2.Height = 30
newPictureBox2.SizeMode = PictureBoxSizeMode.Zoom
newPictureBox2.Name = UserData("Username").ToString
ChatContactList.Controls.Add(newPictureBox2)
Dim newLabel As New Label
AddHandler newLabel.Click, AddressOf Chatbox
newLabel.Text = UserData("Voornaam").ToString & " " & UserData("Achternaam").ToString
newLabel.Name = UserData("Username").ToString
newLabel.Font = New Font("Microsoft sans serif", 12)
newLabel.Dock = DockStyle.Fill
newLabel.TextAlign = ContentAlignment.MiddleLeft
newLabel.Visible = True
ChatContactList.Controls.Add(newLabel)
ElseIf UserData("NieuwBericht").ToString = "Nee" Then
Dim newPictureBox As New PictureBox
newPictureBox.Image = My.Resources.orangechat
newPictureBox.Visible = True
newPictureBox.Width = 30
newPictureBox.Height = 30
newPictureBox.SizeMode = PictureBoxSizeMode.Zoom
newPictureBox.Name = UserData("Username").ToString
ChatContactList.Controls.Add(newPictureBox)
Dim newPictureBox2 As New PictureBox
newPictureBox2.Image = My.Resources.greybubblechat
newPictureBox2.Visible = True
newPictureBox2.Width = 30
newPictureBox2.Height = 30
newPictureBox2.SizeMode = PictureBoxSizeMode.Zoom
newPictureBox2.Name = UserData("Username").ToString
ChatContactList.Controls.Add(newPictureBox2)
Dim newLabel As New Label
AddHandler newLabel.Click, AddressOf Chatbox
newLabel.Text = UserData("Voornaam").ToString & " " & UserData("Achternaam").ToString
newLabel.Name = UserData("Username").ToString
newLabel.Font = New Font("Microsoft sans serif", 12)
newLabel.Dock = DockStyle.Fill
newLabel.TextAlign = ContentAlignment.MiddleLeft
newLabel.Visible = True
ChatContactList.Controls.Add(newLabel)
End If
ElseIf UserData("Status").ToString = "Offline" Then
If UserData("NieuwBericht").ToString = "Ja" Then
Dim newPictureBox As New PictureBox
newPictureBox.Image = My.Resources.redchat
newPictureBox.Visible = True
newPictureBox.Width = 30
newPictureBox.Height = 30
newPictureBox.SizeMode = PictureBoxSizeMode.Zoom
newPictureBox.Name = UserData("Username").ToString
ChatContactList.Controls.Add(newPictureBox)
Dim newPictureBox2 As New PictureBox
newPictureBox2.Image = My.Resources.greenbubblechat
newPictureBox2.Visible = True
newPictureBox2.Width = 30
newPictureBox2.Height = 30
newPictureBox2.SizeMode = PictureBoxSizeMode.Zoom
newPictureBox2.Name = UserData("Username").ToString
ChatContactList.Controls.Add(newPictureBox2)
Dim newLabel As New Label
AddHandler newLabel.Click, AddressOf Chatbox
newLabel.Text = UserData("Voornaam").ToString & " " & UserData("Achternaam").ToString
newLabel.Name = UserData("Username").ToString
newLabel.Font = New Font("Microsoft sans serif", 12)
newLabel.Dock = DockStyle.Fill
newLabel.TextAlign = ContentAlignment.MiddleLeft
newLabel.Visible = True
ChatContactList.Controls.Add(newLabel)
ElseIf UserData("NieuwBericht").ToString = "Nee" Then
Dim newPictureBox As New PictureBox
newPictureBox.Image = My.Resources.redchat
newPictureBox.Visible = True
newPictureBox.Width = 30
newPictureBox.Height = 30
newPictureBox.SizeMode = PictureBoxSizeMode.Zoom
newPictureBox.Name = UserData("Username").ToString
ChatContactList.Controls.Add(newPictureBox)
Dim newPictureBox2 As New PictureBox
newPictureBox2.Image = My.Resources.greybubblechat
newPictureBox2.Visible = True
newPictureBox2.Width = 30
newPictureBox2.Height = 30
newPictureBox2.SizeMode = PictureBoxSizeMode.Zoom
newPictureBox2.Name = UserData("Username").ToString
ChatContactList.Controls.Add(newPictureBox2)
Dim newLabel As New Label
AddHandler newLabel.Click, AddressOf Chatbox
newLabel.Text = UserData("Voornaam").ToString & " " & UserData("Achternaam").ToString
newLabel.Name = UserData("Username").ToString
newLabel.Font = New Font("Microsoft sans serif", 12)
newLabel.Dock = DockStyle.Fill
newLabel.TextAlign = ContentAlignment.MiddleLeft
newLabel.Visible = True
ChatContactList.Controls.Add(newLabel)
End If
End If
End While
我的联系人列表的图片
UserControl 有点像子窗体。它是各种控件的容器,这些控件共同作用或代表某个逻辑单元。在这种情况下,它将是某些用户状态(属性)的可视化表示。与其创建和管理 单独的控件 ,不如将它们放在一个 UC 上并封装 很多 代码来管理它们。
在 Solution Explorer window 中,右键单击 select Add,然后选择 用户控件。我添加了一个 TableLayoutPanel、2 个 PictureBoxes 和一个 Label(当然,所有这些都有正确的名称)。 还有一个:ImageList
可以快速抓取你的图片
这个 单独 替换了许多代码行,您必须创建新控件,然后一遍又一遍地设置相同的属性。为了使它们充当逻辑对象,您可以添加抽象 selecting 图像等细节的属性:
Public Class Chatter
Public Enum ChatStatus
Unknown
Online
Away
Offline
End Enum
Public Enum ChatMsgStatus
Undefined ' kludge to force the initial state
Unknown
[New]
Read
End Enum
' one set of images for all chatter instances
Private Shared Imgs As Image()
Public Property ChatId As Int32 ' or guid?
Private chName As String = ""
Public ReadOnly Property ChatName As String
Get
Return chName
End Get
End Property
Private mStatus As ChatMsgStatus = ChatMsgStatus.Undefined
Public Property MsgStatus As ChatMsgStatus
Get
Return mStatus
End Get
Set(value As ChatMsgStatus)
If (value <> mStatus) Then
Select Case value
Case ChatMsgStatus.New
pbMStatus.Image = Imgs(3)
Case ChatMsgStatus.Read
pbMStatus.Image = Imgs(4)
Case Else
pbMStatus.Image = Imgs(4)
End Select
End If
mStatus = value
End Set
End Property
Private chStatus As ChatStatus = ChatStatus.Unknown
Public Property Status As ChatStatus
Get
Return chStatus
End Get
Set(value As ChatStatus)
If value <> chStatus Then
Select Case value
Case ChatStatus.Online
pbUStatus.Image = Imgs(0)
Case ChatStatus.Away
pbUStatus.Image = Imgs(1)
Case ChatStatus.Offline
pbUStatus.Image = Imgs(2)
Case Else
End Select
End If
chStatus = value
End Set
End Property
Public Sub New()
' This call is required by the designer.
InitializeComponent()
If Imgs Is Nothing Then
Imgs = New Image() {My.Resources.ChatUserGrn, My.Resources.ChatUserYlw,
My.Resources.ChatUserRed, My.Resources.ChatBalloonGrn,
My.Resources.ChatBalloonGry}
' see note
End If
End If
' Add any initialization after the InitializeComponent() call.
End Sub
' no need to create one without Identifiers
Public Sub New(n As Int32, cname As String)
MyClass.New()
' default intitial values:
chName = cname
ChatId = n
lblChName.Text = cname
Me.Status = ChatStatus.Online
Me.MsgStatus = ChatMsgStatus.Unknown
End Sub
End Class
(编辑)我不喜欢使用 ImageList 的结果。此版本从资源中加载一组图像。除了仅加载一份 GreenUser 供所有用户使用外,它还允许您根据需要对其进行定制。例如,将背景颜色更改为 SystemColors.Window
以匹配用户的主题。如果您还使用标签而不是图片框,则可以使用 Text
属性 表示“?”甚至指明新消息的 数量 。
我确定它还有更多内容,我可以想到几件事 我 想让它知道(例如覆盖带有未读消息数量的绿色气球)。但这里的要点是 封装的概念 ,DRY 和可重用代码。
编译时,工具箱中会多出一个新的Chatter
控件。使用公开的属性在运行时添加一些:
Dim c As New Chatter(42, "Ziggy von Hausen")
flpChat.Controls.Add(c)
c = New Chatter(14, "ThDutoit")
c.MsgStatus = Chatter.ChatMsgStatus.New
flpChat.Controls.Add(c)
c = New Chatter(78, "Plutonix")
c.Status = Chatter.ChatStatus.Offline
flpChat.Controls.Add(c)
c = New Chatter(4, "Codexer")
c.MsgStatus = Chatter.ChatMsgStatus.New
c.Status = Chatter.ChatStatus.Away
flpChat.Controls.Add(c)
Id 将是唯一标识每个聊天参与者的东西。名称通常不够用(SO 已超过 50 pages of people named "Steve")并且您需要一种方法来识别 link 用户的控件。 (另一种方法是用户列表中的 ChatterBox
引用,它是对相关 UserControl
:
Dim user = "Codexer"
Dim chatter = flpChat.Controls.
OfType(Of Chatter).
FirstOrDefault(Function(c) c.ChatName.StartsWith(user))
If chatter IsNot Nothing Then
chatter.Status = chatter.ChatStatus.Online
End If
每次搜索都不是最优的,Id
比单纯的名字更好。理想的情况是 ChatUser
class 包含应用程序必须由用户存储的所有 other 内容。 class 应该包含对控件的引用,以便当状态发生变化或发生其他情况时,class 可以简单地:
myChatterBox.Status = myStatus
结果:
当然可以用相当少的代码创建它们。在事情的过程中,您可以通过设置相关的 属性.
来更改任一图像的状态作为一个额外的好处,因为您不再创建单独的控件,并且因为 UserControl
继承自 Component
,您不必担心泄漏 if/when 这些已被删除。