将PictureBox添加到其他类的控件中

本文关键字:控件 其他 PictureBox 添加 | 更新日期: 2023-09-27 18:24:04

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

将PictureBox添加到其他类的控件中

如果你正在使用WinForms制作游戏,那么就不要这样做,因为它们不是为了这个目的。有一些库是针对这一点的(XNA和多平台Monogame是最受欢迎的)。

然而,为了回答你的问题,你的问题是你需要一个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(/**/);
    }
}

singleton模式稍微复杂一些,我不建议初学者使用它,因为它可能会导致混乱。然而,如果你想了解它,请查看这篇文章。

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

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

在任何情况下,你通常都不想直接作用于机器的齿轮。你想抽象你的代码,这样它看起来更像一个易于使用的界面:如果你的类告诉表单"它应该更新picturebox的位置",而不是实际执行,你会有更好的代码。这在很多方面都是有益的,尤其是对维护来说。一个例子如下。

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
    }
}

在您想添加图片框的地方试试这个

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添加到代码顶部,使其成为全局变量。然后你可以从任何地方访问它,也可以编辑它。