发布设计代码来管理对象

时间:2014-03-26 12:09:22

标签: c# picturebox

我有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();

1 个答案:

答案 0 :(得分:1)

我可以创建一个新的Control,很可能是一个包含所有这些UI元素的Panel(PictureBox,Label,其他任何东西)。有一个Control的构造函数,它接受图像的URL。将图像加载到PictureBox中,然后设置标签。

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

不要忘记实施IDisposable,并在删除控件时将其丢弃,以释放显示图像的资源。

修改

如果它不存在,您可以通过传递this作为参数,将引用返回到每个内部控件(PictureBox和Label)中的顶部控件,甚至提供到顶部控件中的主窗体在构造函数中,并在这些控件中设置私有成员变量。这样,当有人点击PictureBox时,你可以上线到this.Parent并获得你的外部控制。你甚至可以参考你的主表格(希望那里的一个小组能够保存你的4个这些对象)。可以this.Parent.Parent在那里调用方法。 (我认为所有控件上都有Parent的公共属性,所以没关系。)

一点点快速编码:

您拥有主FormmainForm)。有一个PanelpicturePanel)。 picturePanel会保留您的4个新Panel,我们称之为customPanel。每个customPanel都有PictureBoximageBox)和标签(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);
}