我正在设计一个基于静态图像的小型交互式内部地图,并使用GIF在它们之间进行转换,以模拟3D运动。图像和GIF包含在图片框中。表单使用按钮触发图片框,图片框根据位置保存特定图像文件。基本上每个图片框都是墙或用于模拟gif的移动。
现在,我可以通过在主窗体中按钮的点击事件中使用以下代码来完美地工作:
pboxSCREEN.Image = new Bitmap(Path.Combine(Environment.CurrentDirectory, @"Resources\start2.jpg"));
但是我想使用单独的类来保存变量中的所有图像文件,并在主窗体中按钮的单击事件中使用方法调用来获取图像I需要显示。这个想法是让单独的班级来存储"墙壁"我需要在主表单中调用。到目前为止,这是我在单独的课程中所拥有的:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
namespace TheEldritchTruth
{
public class WallCollection
{
public Image img1 = null;
public WallCollection()
{
img1 = new Bitmap(Path.Combine(Environment.CurrentDirectory, @"Resources\resident.gif"));
}
public Image Img1
{
get { return img1; }
set { img1 = value; }
}
}
}
我设置一个变量来保存表单中的类:
public WallCollection walls;
在Load事件中初始化它:
WallCollection walls = new WallCollection();
我的问题是 - 如何在按钮的点击事件中调用单独类中的方法?我已经尝试了几种不同的运气方式,到目前为止,我有类似的东西:
//FORWARD btn
public async void btnForward_Click(object sender, EventArgs e)
{
if (pos == 0)
{
pboxSCREEN.Visible = true;
pboxSCREEN.Image = walls.Img1;
//pBoxItem.Visible = false;
pos = 1;
}
}
我无法使用此逻辑显示图像,并收到此错误:
"对象引用未设置为对象的实例。"
答案 0 :(得分:0)
要在Forward
和Backward
按钮中使用图像,您不需要单独的类。您可以改为使用List<Bitmap>
。
在下面的代码中,我存储了所有位图int List<Bitmap> bitmaps
。当您需要位图时,可以通过以下索引调用它:bitmaps[0]
表示第一个位图,bitmaps[1]
表示第二个位图,...
代码示例:
public partial class Form1 : Form
{
List<Bitmap> bitmaps = new List<Bitmap>();
int pos = 0;
public Form1()
{
InitializeComponent();
AddBitmaps();
if (bitmaps.Count > 0)
{
pboxSCREEN.Image = bitmaps[0];
}
}
void AddBitmaps()
{
bitmaps.Add(new Bitmap(Path.Combine(Environment.CurrentDirectory, @"Resources\resident.gif")));
bitmaps.Add(new Bitmap(Path.Combine(Environment.CurrentDirectory, @"Resources\start2.jpg")));
}
public void btnForward_Click(object sender, EventArgs e)
{
if (pos > 0 && pos <= bitmaps.Count)
{
pos--;
pboxSCREEN.Visible = true;
pboxSCREEN.Image = bitmaps[pos];
}
}
public void btnBackward_Click(object sender, EventArgs e)
{
if (pos + 1 < bitmaps.Count)
{
pos++;
pboxSCREEN.Visible = true;
pboxSCREEN.Image = bitmaps[pos];
}
}
}