在我的代码中,每次按下button1时,就会在面板中生成一个名为NOT的图片框实例。单击并按住图像后,可以将其拖动。我的问题是每次按下button1时,我都希望创建另一个具有相同属性的pictureBox,以便从理论上讲,我可以整天按下button1并根据需要拖动任意数量的NOT picturebox对象。到目前为止,一旦按下按钮,只会创建一个NOT实例,而不能生成另一个实例。因此,从本质上讲,每次按下button1时如何制作NOT的新唯一实例。
public Form1()
{
InitializeComponent();
Drag();
}
private void button1_Click(object sender, EventArgs e)
{
spawnGate("not");
}
PictureBox NOT = new PictureBox();
private Point startPoint = new Point();
public void Drag()
{
NOT.MouseDown += (ss, ee) =>
{
if (ee.Button == System.Windows.Forms.MouseButtons.Left)
{
startPoint = Control.MousePosition;
}
};
NOT.MouseMove += (ss, ee) =>
{
if (ee.Button == System.Windows.Forms.MouseButtons.Left)
{
Point temp = Control.MousePosition;
Point res = new Point(startPoint.X - temp.X, startPoint.Y - temp.Y);
NOT.Location = new Point(NOT.Location.X - res.X, NOT.Location.Y - res.Y);
startPoint = temp;
}
};
}
public void spawnGate(string type)
{
switch (type)
{
case "not":
NOT.Width = 100;
NOT.Height = 50;
NOT.Image = Properties.Resources.Not_gate;
NOT.SizeMode = PictureBoxSizeMode.Zoom;
workspace.Controls.Add(NOT);
break;
}
}
}
答案 0 :(得分:4)
将NOT
更改为List<PictureBox>
。
然后,在new PictureBox
方法中向NOT
添加一个spawnGate()
实例。请注意,Drag()
将需要更改以接受PictureBox
参数。
编辑:根据注释中的要求,为了使其他访问此问题的人受益,这里正是需要更改代码才能获得OP请求的行为的方法。请注意,这种设计可以而且应该在几个方面进行重构。
List<PictureBox> NOT = new List<PictureBox>();
Point startPoint = new Point();
public Form1()
{
InitializeComponent();
Drag();
}
private void button1_Click(object sender, EventArgs e)
{
spawnGate();
}
public void spawnGate()
{
var pictureBox = new PictureBox()
{
Width = 100,
Height = 50,
Image = Properties.Resources.Not_gate,
SizeMode = PictureBoxSizeMode.Zoom
}
Drag(pictureBox);
NOT.Add(pictureBox);
workspace.Controls.Add(pictureBox);
}
public void Drag(PictureBox pictureBox)
{
pictureBox.MouseDown += (ss, ee) =>
{
if (ee.Button == System.Windows.Forms.MouseButtons.Left)
startPoint = Control.MousePosition;
};
pictureBox.MouseMove += (ss, ee) =>
{
if (ee.Button == System.Windows.Forms.MouseButtons.Left)
{
Point temp = Control.MousePosition;
Point res = new Point(startPoint.X - temp.X, startPoint.Y - temp.Y);
pictureBox.Location = new Point(pictureBox.Location.X - pictureBox.X, pictureBox.Location.Y - res.Y);
startPoint = temp;
}
};
}
答案 1 :(得分:0)
您不必将指向NOT的指针直接保存在表单上(或者,如果以后需要调用它们,可以将它们保存到列表中)。
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
spawnGate("not");
}
// This list is optional, if you easily want to find them later
List<PictureBox> allNOTs = new List<PictureBox>();
public void spawnGate(string type)
{
switch (type)
{
case "not":
PictureBox NOT = new PictureBox();
NOT.Width = 100;
NOT.Height = 50;
NOT.Image = Properties.Resources.Not_gate;
NOT.SizeMode = PictureBoxSizeMode.Zoom;
NOT.MouseDown += (ss, ee) =>
{
// Mouse down event code here
};
NOT.MouseMove += (ss, ee) =>
{
// Mouse move event code here
};
allNOTS.Add(NOT); // Optional if you easily want to find it later
workspace.Controls.Add(NOT);
break;
}
}
}