2013-06-22 52 views
0

我正在爲一家公司開發「緩存圖像生成器」。
這種形式的目標是預先計算所有可能的按鈕場景。
它創建了幾個自定義按鈕,拍攝快照,清除所有內容並重做,直到全部嘗試完畢。無法銷燬我的按鈕標籤

我的問題是,我不能銷燬我的自定義按鈕內的標籤。
我的自定義按鈕工作正常,我可以生成第一個圖像。
因爲我使用索引作爲標籤名稱的最後一部分,我相信,第二回合將由於現有的具有相同名稱的項目而失敗。

這是如何我試圖毀滅一切:

foreach (my_button b in this.wrapper.Controls.OfType<my_button>()) 
{ 
    b.resume_layout(); 
    b.show(); 
} 
this.PerformLayout(); 
bmp = new Bitmap(this.wrapper.Width, this.wrapper.Height); 
this.wrapper.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height)); 
a.result = bmp; 
cc = this.wrapper.Controls; 
this.wrapper.Controls.Clear(); 
foreach (Control C in cc) 
    C.Dispose(); 
cc = null; 
GC.Collect(); 

,這是自定義處置my_button的處理程序:

new public void Dispose() 
    { 
     this.Dispose(true); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     this.currency_label.Dispose(); 
     this.name_label.Dispose(); 
     this.price_label.Dispose(); 
     this.currency_label = this.name_label = this.price_label = null; 
     this.BackgroundImage = null; 
     this.Controls.Clear(); 
     base.Dispose(disposing); 
    } 

我認爲,這是一個不破壞麻煩,因爲我隨機獲取:
Illegal cross-thread operation: Control 'control name' accessed from a thread other than the thread it was created on.標籤Dispose()調用。

在此先感謝您的幫助。

- 編輯 -

我解決了。
問題是我mooremachine框架錯誤的呼叫設置一切可見=假
請刪除這個問題,因爲它不會是有用的。

+0

'GC.Collect'從來就不是一個好主意。我想你想使用'cc.Controls.Remove(c)'(現在不確定正確的語法) – Sayse

+0

Button b = new Button(); ContentControl c = b作爲ContentControl; c.Content = null; –

回答

0

對於跨線程調用異常的原因,那是因爲您沒有正確執行Dispose(bool)。可以從終結器方法調用Dispose(bool),並且調用線程未指定,例如它可以來自任何線程。

關於您添加的控件,您不需要添加額外的處理方法。子控件被自動處理。

http://msdn.microsoft.com/en-us/library/a4zkb31d.aspx

Control.Dispose方法(布爾)

釋放由控制及其子 控制使用和任選的非託管資源釋放託管資源。

無論如何,如果位圖的所有者爲my_button並且沒有其他對象使用相同的位圖,則可能需要處理自己的位圖。你可以這樣做如下:

protected override void Dispose(bool disposing) 
{ 
    if (disposing) { 
     var backgroundImage = this.BackgroundImage; 
     this.BackgroundImage = null; 
     backgroundImage.Dispose(); 
    } 
    base.Dispose(disposing); 
} 

而且不需要再聲明Dispose()方法。

+0

感謝您的回答,它解決了異常錯誤。 但我無法在第二輪中更改按鈕的「可見」屬性。第一輪my_button創建時使用Visible = true 在第二輪創建它們時使用Visible = false創建,即使我調用b.Visible = true我仍然在Immediate Window中看到Visible = false。 我更新了我的問題,我認爲主要的問題是我無法創建其他標籤,因爲較舊的(具有相同名稱)已經存在某處。 再次感謝您的幫助:) –