【问题标题】:Update control backcolor at desing-time在设计时更新控件背景色
【发布时间】:2013-12-15 16:22:17
【问题描述】:

我继承了一个列表框控件来编写一些这样的属性:

''' <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 以更新控件上的更改以查看新颜色。

这样做的正确方法是什么?

更新:

我认为这样做的方法是添加一个特殊标志或其他东西......

我已经尝试过了,但是该属性在编辑器中变得无法访问:

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

【问题讨论】:

  • 我不明白为什么更改 DT 编辑器会对这个问题产生任何影响。
  • Bjørn-Roger Kringsjå 是的,你说得对,我不知道我在尝试什么,抱歉

标签: .net vb.net winforms visual-studio user-controls


【解决方案1】:

当属性改变时使控件失效如何?

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

在你的绘画方法中:

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

【讨论】:

  • 谢谢,但没用,无论如何我认为使控件无效不是正确的方法。
  • 我已经更新了答案,以确保所有孩子都得到验证。 (如果 ListBox 在 UserControl 中)
  • 伙计们,我在顶级类声明中实例化了一个画笔,当我设置(颜色)属性时,那个画笔被“替换”了,然后我总是使用相同的画笔对象变量,真的不是比每次在绘画活动中实例化/处理新画笔更好?...
  • 关键在于如何在整个代码中处理画笔。如果您确保处理刷子,那就没问题了。但我仍然认为该字段应该与反射属性的类型相同。
【解决方案2】:

部分问题是该属性被定义为一种颜色,但您正在尝试使用/保存画笔。正确的方法是

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

【讨论】:

  • ItemUnselected_BackColor 是一种颜色,可以在设计时修改颜色(用画笔不能),但是 _ItemUnselected_BackColor 是画笔,这就是我得到颜色但设置画笔的原因,我认为画笔构造函数不会影响并且被正确处理,因为我现在进行了性能测试以确保它,从 0 到 999999 的 for range 循环一直设置属性并且没有找到额外的内存。如果使控件无效是正确的方法,那么我应该相信它,谢谢您提供的所有信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
相关资源
最近更新 更多