我为一个应该在表单上创建图片框的生物创建了一个类。我的问题是我想创建一个在我的类中创建图片的方法以及一个移动它的方法,但是我无法从我的类中访问控件。我尝试Controls.Add(MyPicture);
在 Form.cs 上使用,但后来我无法从控件中删除图片框来移动它。任何帮助都会很棒。谢谢。
2 回答
如果您正在使用 WinForms 制作游戏,那么请不要这样做,因为它们并非用于那种目的。有一些针对此的库(XNA 和多平台 Monogame 是最受欢迎的)。
但是,要回答您的问题,您的问题是您需要 Form1 类的实例,以便您可以随意调用 myFormInstance.Controls.Add / Remove。现在,要获取您的实例,有两种方法。最简单的方法是检查您的 Program.cs 代码。您将看到 Form1 被实例化。“new Form1()”是您需要全球化的代码。因此,您可以将其转换为如下所示的内容,并使用您的类中的静态引用,或者您遵循单例模式。
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(/**/);
}
}
单例模式稍微复杂一些,我不建议初学者使用,因为它可能会导致混乱。但是,如果您想了解它,请查看这篇文章。
编辑:阅读更好之后,您在表单内移动控件也有麻烦。首先,您不需要在每次需要更改属性时添加和删除它们。“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
}
}
试试这个你想添加图片框的地方
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 成为全局变量。然后你可以从任何你想要的地方访问它,你可以编辑它。