VB.Net 如何以编程方式添加控件和事件处理程序
VB.Net How to programmatically add a control and an event handler
我正在使用 PictureBox 控件创建游戏并添加 MouseDown 事件来处理减少 PictureBox 的 "health" 值。
我想在初始控件失去所有健康时以编程方式添加一个新控件,以便我可以为新 PictureBox 的显示方式添加变化,但我不知道如何以编程方式将事件处理程序添加到创建控件。
更新:感谢您的帮助!
如果您想这样做,这就是我完成的代码的工作方式。
Public Class Form1
Private Sub NewBug()
Dim pbBug As New PictureBox With {
.Name = "pb",
.Width = 100,
.Height = 100,
.Top = 75,
.Left = 75,
.SizeMode = PictureBoxSizeMode.Zoom,
.Image = My.Resources.bug}
Me.Controls.Add(pbBug)
AddHandler pbBug.MouseDown, Sub(sender As Object, e As EventArgs)
MessageBox.Show("Hello", "It Worked")
End Sub
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
NewBug()
End Sub
谢谢,
sunnyCr
有些事情不对劲。看起来 Dim MyButton As New Button()
应该在 Class 范围内声明,您不必在局部变量上声明 WithEvents。此外,如果 MyButton 是 Local 以加载例程,MyButton_Click
sub 将不会编译。如果它是在 Class 范围内声明的,那么你会 WithEvents MyButton As New Button
而不是 Dim MyButton As New Button
如果你想将它保留在本地,那么你可以这样做
Dim MyButton As New Button With {
.Name = "MyButton",
.Top = 100,
.Left = 100,
.Image = My.Resources.SomeImage}
Controls.Add(MyButton)
AddHandler MyButton.Click, Sub(s As Object, ev As EventArgs)
'Do stuff
End Sub
这通常是我这样做的方式,除非我打算删除处理程序,否则我将创建一个 Sub 并使用 AddressOf,例如您尝试使用它的方式。
您必须创建一个 class 以通过代码导入生成图片框 windows.system.Forms;例如,您可以这样做,更改图片框的标签:
这是class:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
class Etiqueta
{
private Label etiquetaHija;
public Label EtiquetaHija { get => etiquetaHija; set => etiquetaHija = value; }
public Etiqueta(Point posicion, Size dimensiones, string texto)
{
etiquetaHija = new Label();
etiquetaHija.Size = dimensiones;
etiquetaHija.Location = posicion;
etiquetaHija.Text = texto;
etiquetaHija.Click += EtiquetaHija_Click;
}
private void EtiquetaHija_Click(object sender, EventArgs e)
{
MessageBox.Show("Etiqueta Hija");
}
}
这是表格的隐藏代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Etiqueta etiqueta = new Etiqueta(new Point(20, 20), new Size(100, 100), "Ejemplo de creacion de un label por codigo con manejador de eventos");
this.Controls.Add(etiqueta.EtiquetaHija );
}
}
}
我正在使用 PictureBox 控件创建游戏并添加 MouseDown 事件来处理减少 PictureBox 的 "health" 值。
我想在初始控件失去所有健康时以编程方式添加一个新控件,以便我可以为新 PictureBox 的显示方式添加变化,但我不知道如何以编程方式将事件处理程序添加到创建控件。
更新:感谢您的帮助! 如果您想这样做,这就是我完成的代码的工作方式。
Public Class Form1
Private Sub NewBug()
Dim pbBug As New PictureBox With {
.Name = "pb",
.Width = 100,
.Height = 100,
.Top = 75,
.Left = 75,
.SizeMode = PictureBoxSizeMode.Zoom,
.Image = My.Resources.bug}
Me.Controls.Add(pbBug)
AddHandler pbBug.MouseDown, Sub(sender As Object, e As EventArgs)
MessageBox.Show("Hello", "It Worked")
End Sub
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
NewBug()
End Sub
谢谢, sunnyCr
有些事情不对劲。看起来 Dim MyButton As New Button()
应该在 Class 范围内声明,您不必在局部变量上声明 WithEvents。此外,如果 MyButton 是 Local 以加载例程,MyButton_Click
sub 将不会编译。如果它是在 Class 范围内声明的,那么你会 WithEvents MyButton As New Button
而不是 Dim MyButton As New Button
如果你想将它保留在本地,那么你可以这样做
Dim MyButton As New Button With {
.Name = "MyButton",
.Top = 100,
.Left = 100,
.Image = My.Resources.SomeImage}
Controls.Add(MyButton)
AddHandler MyButton.Click, Sub(s As Object, ev As EventArgs)
'Do stuff
End Sub
这通常是我这样做的方式,除非我打算删除处理程序,否则我将创建一个 Sub 并使用 AddressOf,例如您尝试使用它的方式。
您必须创建一个 class 以通过代码导入生成图片框 windows.system.Forms;例如,您可以这样做,更改图片框的标签:
这是class:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
class Etiqueta
{
private Label etiquetaHija;
public Label EtiquetaHija { get => etiquetaHija; set => etiquetaHija = value; }
public Etiqueta(Point posicion, Size dimensiones, string texto)
{
etiquetaHija = new Label();
etiquetaHija.Size = dimensiones;
etiquetaHija.Location = posicion;
etiquetaHija.Text = texto;
etiquetaHija.Click += EtiquetaHija_Click;
}
private void EtiquetaHija_Click(object sender, EventArgs e)
{
MessageBox.Show("Etiqueta Hija");
}
}
这是表格的隐藏代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Etiqueta etiqueta = new Etiqueta(new Point(20, 20), new Size(100, 100), "Ejemplo de creacion de un label por codigo con manejador de eventos");
this.Controls.Add(etiqueta.EtiquetaHija );
}
}
}