2013-12-15 4 views
0

Я унаследовал контроль ListBox, чтобы написать некоторые свойства, как это:Update BackColor управления в Desing времени

''' <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 

Проблема заключается в том, что, когда я изменить цвет в дизайне, мне нужно, чтобы переместить элемент управления или минимизировать/увеличить IDE VisualStudio, чтобы обновить изменения в элементе управления, чтобы увидеть новый цвет.

Каков путь для этого?

UPDATE:

Я думаю, что способ сделать это добавление специального флага или что-то еще ...

Я попытался это, но свойство становится невозможным на редактор:

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

Я не понимаю, почему изменение редактора DT повлияет на эту проблему. –

+0

Bjørn-Roger Kringsjå Да, вы правы, я действительно не знал, что я пытался, извините – 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 будет правильным способом обновить контроль, потому что, хорошо текущий дисплей не недействительным, учитывая новые настройки цвета. Кисть должна быть создана в процедурах paint или OnDrawItem, не входящих в свойство get/setter. Ваш код не использует предыдущий.

Эти атрибуты не нужны и не делают то, что, по вашему мнению, они делают. Они определяли бы особый способ (например, Dialog), чтобы получить цвет.

Этот 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 

EDIT

Поскольку настоятельно рекомендуется использовать только для создания кисти, при необходимости, вы должны сделать это следующим образом:

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 
+0

thankyou, но не работает, так или иначе, я считаю, что недействительным элемент управления не может быть правильным способом сделать это. – ElektroStudios

+0

Я обновил ответ, чтобы убедиться, что все дети прошли проверку. (Если ListBox находится внутри UserControl) –

+0

+1 для 'создания кисти при необходимости' – Plutonix

Смежные вопросы