将PictureBox添加到另一个类的控件

时间:2013-07-21 23:24:41

标签: c# class picturebox

我为一个应该在表单上创建一个图片框的生物制作了一个类。 我的问题是我想创建一个在我的类中创建图片的方法以及一个移动它的方法,但是我无法从我的类中访问控件。我尝试在Form.cs上使用Controls.Add(MyPicture);,但是我无法从控件中删除图片框来移动它。任何帮助都会很棒。感谢。

2 个答案:

答案 0 :(得分:1)

如果您正在使用WinForms进行游戏,那么就不要因为它们不是出于这种目的而使用。有针对它的图书馆(XNA和多平台Monogame是最受欢迎的)。

Howerver,为了回答你的问题,你的问题是你需要一个Form1类的实例,这样你就可以随意调用myFormInstance.Controls.Add / Remove。 现在,为了获得你的实例,有两种方法。 最简单的方法是检查Program.cs代码。您将看到Form1被实例化。 “new Form1()”是您需要全球化的代码。 因此,您要么将其转换为类似于以下内容的内容,并使用该类中的静态引用,要么遵循Singleton模式。

static class Program
{
    public static Form1 myFormInstance;
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run((myFormInstance= new Form1()));
    }
}
static class MyClass
{
    static void DoWorkWithForm()
    {
          Program.myFormInstance.Controls.Add(/**/);
    }
}

单身模式稍微复杂一些,我不建议初学者,因为它可能导致混乱。但是,如果您想了解它,请查看this article

编辑:在阅读得更好之后,您还会在表单中移动控件时遇到麻烦。 首先,每次需要更改属性时都不需要添加和删除它们。 “Form.Controls”是从Control派生的对象的动态列表,它不是值类型。这意味着一旦添加它们,就会存储对它们的引用,而不是副本。简单来说,从列表外部修改它们就足以反映代码中其他地方的变化。在初始化期间添加它们,然后忘记它。

要移动它们,您可以遵循与之前相同的方案并使控件静态(例如public static ImagePanel myImagePanel ..),或使它们成为Form1实例的成员,并通过它处理它们。 (myFormInstance.myImagePanel而不是Form1.myImagePanel)。后者是更好的选择。

在任何情况下,您通常不希望直接对机器的齿轮进行操作。你想抽象你的代码,使它看起来更像一个易于使用的界面:如果你的类告诉表单“它应该更新图片框的位置”,而不实际做,你将有一个更好的代码。这在许多方面都是有益的,特别是对于维护。 一个例子如下。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    public void MovePicturebox(Point p)
    {
        pictureBox1.Location = p;
    }
}

public static class MyClass
{
    public static void DoWork()
    {
        //... code
        Program.myForm.MovePicturebox(new Point(10, 10));
        //... code
    }
}

答案 1 :(得分:0)

尝试添加图片框

PictureBox pb = new PictureBox();
pb.Width = 200;
pb.Height = 300;
pb.Location = new Point(100, 100);
pb.Visible = true;
pb.Show();
Controls.Add(pb);
pb.BackColor = Color.Black;

您可以通过在代码顶部添加pb来使pb成为全局变量。然后你可以从任何你想要的地方访问它,你可以编辑它。