设计管理对象的代码

本文关键字:代码 对象 管理 | 更新日期: 2023-09-27 17:53:44

我有一个显示相机快照的C# winform。表单有四个PictureBox控件,当一个图像被取走时,它被放置在pictureBox1中,前面的图像被撞到2、3和4。在每个图片框下面还有一个标签,它显示了时间戳和订单号(每个图像都有一个数字1-4,这个数字一直保持到它被最新的图像所取代)。目前我是这样做的。然而,我觉得这是非常低效的,如果我决定添加按下键事件来改变一些标签的背景色(以指示状态),将会给我带来问题。

有谁知道更好的方法吗?

if (count > 4)
{
    count = 0
}
count ++;
pictureBox4.image = pictureBox3.image;
pictureBox3.image = pictureBox2.image;
pictureBox2.image = pictureBox1.image;
pictureBox1.imagelocation = (@"http://192.168.X.X/image.cgi")
label4.Text =label3.text;
label3.text = label2.text;
label2.text = label1.text;
label1.text = count.ToString()+ " " + datetime.now();

设计管理对象的代码

我可以创建一个新的控件,最有可能是一个面板,其中包含所有这些UI元素(PictureBox, Label等)。为控件创建一个构造函数,该构造函数接受图像的URL。将图片加载到你的PictureBox中,并设置你的标签。

将所有逻辑封装在控件中。因此,当添加一个新的控件时,您只需创建新的控件,并删除行中最后一个控件,并将剩余3个控件的.Left属性移动到它们的新位置。

不要忘记实现IDisposable,并在控件被移除时处置控件,以释放显示图像的资源。

编辑

如果还没有,你可以在每个内部控件(PictureBox和Label)中提供对顶部控件的引用,甚至可以通过在构造函数中传递this作为参数并在这些控件中设置私有成员变量来提供对顶部控件的引用。这样,当有人点击PictureBox时,你可以到this.Parent获取外部控件。你甚至可以参考你的主窗体(希望有一个面板在那里持有你的4个这些对象)。这可能是this.Parent.Parent,在那里调用一个方法。(我认为在所有控件上已经有一个Parent的公共属性,所以这很好。)

一点点快速编码:

你有你的主Form (mainForm)。里面有一个Panel (picturePanel)。picturePanel容纳4个新的Panel s,我们称之为customPanel。每个customPanel都有一个PictureBox (imageBox)和一个Label (fileNameLabel)。

您的customPanel构造函数看起来像这样:

public partial class CustomPanel : Panel {
    private PictureBox _imageBox;
    private Label _fileNameLabel;
    public CustomPanel() {} // This is most likely tied into the code behind file. Sorry, It's been a while since I've done WinForms
    public CustomPanel(string imageFileName, Panel parent) {
        // Set the source for the PictureBox.
        // Set the Text of the label.
        _parent = parent;
    }
}

继续沿着这一行穿过PictureBox和Label。然后在您的事件中,您让您的PictureBox沿着链向上工作。查找picturePanel。如果你想要真正的花哨,你也可以从Panel中派生,只需要添加一个公共属性来处理customPanel发送消息的所有切换。

在你的PictureBox事件中,你可以写一行这样的代码:

if (this.Parent.Parent is PicturePanel) {
    ((PicturePanel)this.Parent.Parent).RemovePicture(this.Parent);
}