您可以將新處理程序添加到按鈕(或其他控件)的事件中。可能需要同時刪除先前添加的處理程序。由於您沒有詳細說明如何選擇技能,我選擇使用單選按鈕(名稱以rb開頭)。當您單擊其中一個單選按鈕時,它會更改相關按鈕的行爲(我使用了兩個按鈕)。
Public Class Form1
Dim currentClickHandlers As New Dictionary(Of Button, List(Of EventHandler))
Sub SetOnlyClickHandler(target As Button, handler As EventHandler, label As String)
' remove any previously stored click event handlers if they exist
If currentClickHandlers.ContainsKey(target) Then
For Each hndlr In currentClickHandlers(target)
RemoveHandler target.Click, hndlr
Next
currentClickHandlers(target).Add(handler)
Else
Dim evntHandlers = New List(Of EventHandler)
evntHandlers.Add(handler)
currentClickHandlers.Add(target, evntHandlers)
End If
AddHandler target.Click, handler
target.Text = label
End Sub
Sub SetHotButtonAction(target As Button, action As Integer)
' depending on which button is the target, set appropriate actions
Select Case True
Case target.Equals(Button1)
Select Case action
Case 1
target.BackColor = Color.Green
SetOnlyClickHandler(target, AddressOf Heal, "Heal")
Case 2
target.BackColor = Color.Yellow
SetOnlyClickHandler(target, AddressOf Strike, "Strike")
Case 3
target.BackColor = Color.Red
SetOnlyClickHandler(target, AddressOf Finisher, "Finisher")
End Select
Case target.Equals(Button2)
Select Case action
Case 1
target.BackColor = Color.Purple
SetOnlyClickHandler(target, AddressOf RunAway, "Run away")
Case 2
target.BackColor = Color.Pink
SetOnlyClickHandler(target, AddressOf DuckAndCover, "Duck and cover")
End Select
End Select
End Sub
' methods to be used for the actions
Sub Heal(sender As Object, e As EventArgs)
MsgBox("Heal")
End Sub
Sub Strike(sender As Object, e As EventArgs)
MsgBox("Strike")
End Sub
Sub Finisher(sender As Object, e As EventArgs)
MsgBox("Finisher")
End Sub
Sub RunAway(sender As Object, e As EventArgs)
MsgBox("Flee!")
End Sub
Sub DuckAndCover(sender As Object, e As EventArgs)
MsgBox("Duck and cover")
End Sub
' set the actions of the radiobuttons
Private Sub rbHeal_Click(sender As Object, e As EventArgs) Handles rbHeal.Click
SetHotButtonAction(Button1, 1)
End Sub
Private Sub rbStrike_Click(sender As Object, e As EventArgs) Handles rbStrike.Click
SetHotButtonAction(Button1, 2)
End Sub
Private Sub rbFinisher_Click(sender As Object, e As EventArgs) Handles rbFinisher.Click
SetHotButtonAction(Button1, 3)
End Sub
Private Sub rbRunAway_Click(sender As Object, e As EventArgs) Handles rbRunAway.Click
SetHotButtonAction(Button2, 1)
End Sub
Private Sub rbDuckAndCover_Click(sender As Object, e As EventArgs) Handles rbDuckAndCover.Click
SetHotButtonAction(Button2, 2)
End Sub
End Class
非常感謝您的時間和精力。即時通訊完全是新的代碼和你在上面的答案中使用的東西,因此不知道如何直接將它應用到我的代碼是如何佈局的,我是否可以粘貼所有與我的技能相關的代碼程序讓你看看?因爲我不太清楚如何管理這一切。 – user2826539
@ user2826539我建議您爲我發佈的代碼創建一個新的Windows Forms項目,以便您可以看到它是如何工作的。您將需要添加名爲rbHeal,rbStrike,rbFinisher,rbRunAway和rbDuckAndCover的五個單選按鈕和兩個按鈕(將其名稱保留爲默認的Button1和Button2)。運行它,看看它的行爲如何 - 是否以某種類似於你想要的方式工作? –
我得到2錯誤爲以下行(錯誤周圍的方形框架): Dim evntHandlers =新的列表(EventHandler)[來自{處理程序}] currentClickHandlers.Add(target,[evntHandlers)] – user2826539