2011-06-10 51 views
3

我在C#winforms中創建自定義控件。我已經添加一個圖標資源,那麼這個圖標使用下面的代碼繪製在控制:在窗體上繪製自定義圖標

using (Icon oIcon = Properties.Resources.DropDownCustom) 
{ 
    Rectangle RectangleIcon = new Rectangle((DropDownRectangle.X + ((DropDownRectangle.Width/2) - (oIcon.Width/2))), 
     (DropDownRectangle.Y + (((DropDownRectangle.Height/2) - (oIcon.Height/2)) + 1)), 
     oIcon.Width, 
     oIcon.Height); 
    graphics.DrawIcon(oIcon, RectangleIcon); 
} 

這一切工作正常沒有問題,但後來我決定一個選項添加到控件屬性允許開發者加載他們自己的圖標來使用,而不是使用我放置在資源中的圖標。我創建了一個私人圖標變量:

private Icon _DropDownCustom; 

改變在上面的代碼中的「使用」行改爲:

using (Icon oIcon = _DropDownCustom) 

,然後添加到構造以下行來設置默認值的一個在資源。

_DropDownCustom = Properties.Resources.DropDownCustom; 

我加入一個圖標屬性,以便開發人員可以使用thier自己的圖標:

[Category("Appearance"), DisplayName("IconDropDown")] 
public Icon IconDropDownCustom 
{ 
    get { return _DropDownCustom; } 
    set { _DropDownCustom = value; this.Invalidate(); } 
} 

這一切似乎是工作正常,但現在,當我查看窗體上的控件(在開發模式中)它將圖標繪製到控件上 - 很好,但是一旦我選擇了窗體,或者控件的圖標消失了,但其他繪畫仍然保留(即漸變背景)。

有誰知道爲什麼它似乎沒有重新繪製圖標?

非常感謝。

編輯: 我剛剛刪除的代碼「Using(){}」部分,將其改爲:

Icon oIcon = _DropDownCustom; 
Rectangle RectangleIcon = new Rectangle((DropDownRectangle.X + ((DropDownRectangle.Width/2) - (oIcon.Width/2))), 
    (DropDownRectangle.Y + (((DropDownRectangle.Height/2) - (oIcon.Height/2)) + 1)), 
    oIcon.Width, 
    oIcon.Height); 
graphics.DrawIcon(oIcon, RectangleIcon); 

這似乎按預期工作,所以我猜這是什麼做用和處置 - 仍試圖理解違規部分 - 請你解釋爲什麼會發生這種情況?我猜我的「oIcon」基本上只是引用我自定義的Icon變量而不是「按值」(我來自VB背景)。

回答

0

圖標資源周圍的「使用」塊會通知GC該位置的內存不再需要,並將清理它。因此,在第一次繪製圖標後,圖標將不再有效(除非每次繪製圖標時都將其加載並進行處理)。

你或許應該之一:

  • 手柄控制的關閉事件和資源處置那裏。

  • 在您的用戶控件上實施Disposable模式,以便在不再需要您的控件時清理資源(如圖標)。