2014-03-26 46 views
2

我有一個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

這不是真的,我們在這裏回答這類的問題。 「更好」可能意味着任何一件事。 –

+2

這可能會更好問http://codereview.stackexchange.com/ – Chris

回答

1

我可以創建一個新的控制,最有可能包含了所有在它這些UI元素(圖片框,標籤,其他任何東西)的面板。爲您的控件提供一個構造函數,以獲取圖像的URL。將圖像加載到您的PictureBox中,並設置您的標籤。

將所有的邏輯封裝在控件中。因此,當添加新的控件時,只需創建新的控件,然後刪除行中的最後一個控件,然後將剩餘的3個屬性移動到新位置。

不要忘記實施IDisposable,並在控件被移除時處置,以釋放顯示圖像的資源。

編輯

如果它不存在已,你甚至可以在您的主要形式,通過傳遞提供參考回到在每個內部控制的頂部控制(圖片框和標籤),並在頂部控制this作爲構造函數中的參數,並在這些控件中設置私有成員變量。這樣,當有人點擊PictureBox時,你可以上線到this.Parent並獲得你的外部控制。你甚至可以對你的主表單提供這個引用(希望這裏有一個面板可以保存你的4個對象)。那可能是this.Parent.Parent在那裏調用一個方法。 (我認爲已經有家長在所有控件的公共屬性,所以這是很好。)

快速編碼的一點點:

你有你的主FormmainForm)。有一個PanelpicturePanel)。 picturePanel包含4個新的Panel s,我們將其稱爲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在鏈條上運行。要找到picturePanel。如果你想得到真正的幻想,你也可以從Panel得到,並且只需添加一個公共屬性來處理所有發送該消息的轉換。

因此,在你的PictureBox活動下來,你可以有這樣的一行代碼:

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

謝謝,我認爲動態做它,但它會導致按鍵問題,因爲我不知道哪個控件是1,2,3或4基於其訂單號,然後更新哪組對象。我的技能不是太好,因爲我仍然在學習 – user3464024

+0

可以理解。當我第一次開始的時候,我做了一些非常類似的事情。這也將照顧你所有的事件。我會用更多信息更新我的答案。 – krillgar

+0

謝謝,這就是我一直在尋找的。我將不得不對自定義控件做更多的研究。 – user3464024