2013-12-15 92 views
0

我繼承ListBox控件寫一些像這樣的性質:更新控制背景色

''' <summary> 
''' Indicates the BackColor to paint the unselected ListBox items when the ListBox is enabled. 
''' </summary> 
Public Property ItemUnselected_BackColor As Color 
    Get 
     Return _ItemUnselected_BackColor.Color 
    End Get 
    Set(value As Color) 
     _ItemUnselected_BackColor = New SolidBrush(value) 
    End Set 
End Property 

的問題是,當我改變在設計的顏色,我需要移動控制或最小化/最大化VisualStudio IDE以更新控件上的更改以查看新顏色。

哪種方法可以做到這一點?

UPDATE:

我認爲要做到這一點的方法是增加一個特殊的標誌或其他什麼東西......

我已經試過這一點,但物業在成爲unaccesible編輯:

<EditorAttribute(GetType(Color), GetType(UITypeEditor))> _ 
Public Property ItemUnselected_BackColor As Color 
... 
+0

我不明白爲什麼改變DT編輯器會對這個問題有任何影響。 –

+0

Bjørn-RogerKringsjå是的你是對的真的我不知道我在想什麼,對不起 – ElektroStudios

+1

例子UIEditor:http://www.codeproject.com/Articles/687430/Selecting-Forms-Controls-at-Design-Time – Plutonix

回答

1

部分問題是該屬性已定義作爲一種顏色,但您正在嘗試使用/保存畫筆。正確的方法是

Public Property ItemUnselected_BackColor As Color 
    Get 
     Return _ItemUnselected_BackColor 
    End Get 
    Set(value As Color) 
     _ItemUnselected_BackColor = value 
     Me.Invalidate 
    End Set 
End Property 

而且Invalidate是因爲,以及當前顯示的不是無效給出新的顏色設置,以更新控制的正確方法。應該在paintOnDrawItem程序中創建畫筆,而不是在屬性get/setter中。你的代碼沒有處理前一個。

這些屬性是不需要的,不要做你認爲他們做的事。他們會定義一種特殊的方式(如對話框)來獲取顏色。

那我現在開始工作的ListView有一個AlternativeBack顏色。如果你想優化你可以這樣做:

Set(ByVal value As Color) 
     If _AltBackColor <> value Then 
      _AltBackColor = value 
      Me.Invalidate() ' only invalidate/repaint if it changed 
     End If 
End Set 
+0

ItemUnselected_BackColor是一個顏色,可以在設計時修改顏色(刷子不能),但_ItemUnselected_BackColor是一個畫筆,這就是爲什麼我得到一個顏色但設置一個畫筆的原因,我認爲畫筆構造函數沒有影響和正確處理,因爲我現在做了一個性能測試,以確保它,範圍循環從0到999999設置所有的時間屬性和沒有額外的內存找到。如果控制無效是正確的方法,那麼我應該相信它,謝謝你的所有信息 – ElektroStudios

2

如何在屬性更改時使控件失效?

Public Property ItemUnselected_BackColor As Color 
    Get 
     Return _ItemUnselected_BackColor.Color 
    End Get 
    Set(value As Color) 
     _ItemUnselected_BackColor = New SolidBrush(value) 
     Me.Invalidate(True) 
    End Set 
End Property 

編輯

,因爲它強烈建議只創建一個刷在需要的時候,你應該做這樣的:

Public Property ItemUnselected_BackColor As Color 
    Get 
     Return Me._ItemUnselected_BackColor 
    End Get 
    Set(value As Color) 
     If ((value = Color.Transparent) OrElse (value = Color.Empty)) Then 
      Throw New ArgumentOutOfRangeException() 
     End If 
     If (value <> _ItemUnselected_BackColor) Then 
      Me._ItemUnselected_BackColor = value 
      Me.Invalidate() 
     End If 
    End Set 
End Property 

Private _ItemUnselected_BackColor As Color = Color.Black 

而在你的paint方法:

Protected Overrides Sub OnPaint(e As PaintEventArgs) 
    Using b As New SolidBrush(Me._ItemUnselected_BackColor) 
     'TODO: Paint 
    End Using 
    MyBase.OnPaint(e) 
End Sub 
+0

謝謝你,但不工作,無論如何,我認爲使控制失效不能是一個正確的方法來做到這一點。 – ElektroStudios

+0

我已更新答案,以確保所有孩子都得到驗證。 (如果列表框在用戶控件中) –

+0

+ 1用於'在需要時創建畫筆' – Plutonix