C# 发布用于管理对象的设计代码

C# 发布用于管理对象的设计代码,c#,picturebox,C#,Picturebox,我有一个C#winform,它可以显示摄像机的快照。表单有四个PictureBox控件,当拍摄图像时,它被放置到pictureBox1中,前面的图像会按2、3和4的顺序排列。在每个图片框下还有一个标签,显示时间戳和订单号(每个图片都有一个数字1-4,直到它被撞掉,最新的图片就是这个数字)。目前我正在做下面的事情。但是,我觉得这是非常低效的,如果我决定添加向下键事件来更改某些标签的背景色(以指示状态),那么以后会给我带来问题 有人知道更好的方法吗 if (count > 4) { c

我有一个
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)中的top控件,甚至返回到top控件中的主窗体。这样,当有人单击PictureBox时,您可以上行链路到
this.Parent
,并获得外部控制。你甚至可以引用你的主窗体(希望其中有一个面板可以容纳你的4个对象)。这可能是
this.Parent.Parent
调用那里的方法。(我认为所有控件上都已经有了家长的公共财产,所以这很好。)

一点快速编码:

您有您的主
表单
mainForm
)。其中有一个
面板
图片面板
picturePanel
包含4个新的
面板,我们称之为
customPanel
。每个
customPanel
都有一个
PictureBox
imageBox
)和标签(
filenamelab

您的
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;
    }
}
if (this.Parent.Parent is PicturePanel) {
    ((PicturePanel)this.Parent.Parent).RemovePicture(this.Parent);
}
通过PictureBox和标签继续此操作。然后在你的活动中,你有你的图片盒工作链。要查找
图片面板
。如果你真的想玩得开心,你也可以从
面板
中派生出来,只需添加一个公共属性,处理
customPanel
发送消息的所有切换

因此,在PictureBox事件中,您可能有一行代码如下:

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;
    }
}
if (this.Parent.Parent is PicturePanel) {
    ((PicturePanel)this.Parent.Parent).RemovePicture(this.Parent);
}

这不是我们在这里回答的问题。“更好”可能意味着100件事情中的任何一件。这可能会更好地问谢谢,我考虑动态地做它,但是它会导致按键问题,因为我不知道哪个控件是1、2、3或4,根据它的顺序号,然后是哪一组对象更新。我的技能不是很好,因为我还在学习。我刚开始的时候也做了类似的事情。这也将照顾到你的所有事件以及。我会用更多信息更新我的答案。谢谢,这正是我想要的。我将不得不对自定义控件做更多的研究,其实没什么大不了的。只要让您的类从任何类型继承(就像我在上面的构造函数代码中所做的那样)。只要需要,它将继续像原始类型一样工作,但当您将其转换为该类型或将其存储为该类型时,它将具有额外的功能。