按下按钮时如何创建所需数量的对象实例?c#winforms

时间:2018-08-20 14:52:58

标签: c# winforms instance picturebox

在我的代码中,每次按下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;
        }
    }
}

2 个答案:

答案 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;
    }
}

}