2013-12-15 55 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