it's based on an event; and I don't understand how it works.
Если вы установите для ListControl (List/Combo) значение OwnerDraw
, событие DrawItem
запускается каждый раз, когда Windows нужно нарисовать элемент; вы можете предоставить код для изменения цвета, шрифта или других действий.
After the user is finished I would also like to test the items font when processing
Проблема в том, что шрифт основан на состоянии элемента. Как вы описали, то есть является ли элемент оригинальным или добавленным. Это состояние нельзя определить по индексу, и вы не можете впоследствии переопределить это состояние по визуальному элементу, например по тому, как что-то было отрисовано (да и не должны).
Таким образом, задача на самом деле состоит из двух связанных вещей:
- Показать пользователю, какие элементы являются новыми/добавленными
- Отслеживайте их как-то, чтобы код мог их определить
Это будет использовать интерфейс, который вы можете добавить к любому классу. Это делает решение менее специфичным для этого локализованного случая.
Public Interface IListItem
Property Selected As Boolean
Function GetDisplayText() As String ' not really needed
End Interface
Код будет использовать Selected
для отслеживания и отрисовки добавленных элементов. Измените имя, если хотите, но вам также придется изменить код розыгрыша.
Public Class SimpleThing
Implements IListItem
' your stuff
Public Property Name As String
Public Property Value As Int32
Public Property Foo As Int32
Public Property Bar As Single
Public Property Selected As Boolean Implements IListItem.Selected
Public Sub New(n As String, v As Int32,
Optional b As Boolean = True)
Name = n
Value = v
Selected = b
End Sub
Public Function GetDisplayText() As String Implements IListItem.GetDisplayText
Return Name
End Function
Public Overrides Function ToString() As String
Return Name
End Function
End Class
GetDisplayText
должен разрешить другой вывод текста, когда элемент отображается в ListControl, по сравнению с другими ситуациями. Это не жесткое требование.
SimpleThing
может хранить любую информацию об этих вещах, которая вам нужна, чертеж ListBox
/ComboBox
зависит только от элементов IListItem
. Вы можете заполнить элемент управления, используя список как DataSource
:
ListThings = New List(Of SimpleThing)
...
ListThings.Add(New SimpleThing("Able", 42, True))
ListThings.Add(New SimpleThing("Baker", 7, True))
...
ListThings.Add(New SimpleThing("Ziggy", 6, True))
lbEnabler.DataSource = ListThings
lbEnabler.DisplayMember = "Name"
lbEnabler.ValueMember = "Value"
Элемент управления пользовательского интерфейса установлен на OwnerDrawFixed
и использует этот код для рисования элементов:
Private Sub lst_DrawItem(sender As Object,
e As DrawItemEventArgs) Handles lbEnabler.DrawItem
Dim lb As ListBox = CType(sender, ListBox)
If e.Index < 0 Then
TextRenderer.DrawText(e.Graphics, "", lb.Font, e.Bounds, lb.ForeColor)
Return
End If
Dim bg As Color = If(e.State.HasFlag(DrawItemState.Selected),
SystemColors.Highlight, SystemColors.Window)
Dim fg As Color = If(e.State.HasFlag(DrawItemState.Selected),
SystemColors.HighlightText, SystemColors.WindowText)
Dim iItem As IListItem
If TypeOf lb.Items(e.Index) Is IListItem Then
iItem = CType(lb.Items(e.Index), IListItem)
Else
TextRenderer.DrawText(e.Graphics, lb.Items(e.Index).ToString, lb.Font, e.Bounds,
fg, bg, TextFormatFlags.Left Or
TextFormatFlags.VerticalCenter)
Return
End If
e.DrawBackground()
If iItem.Selected Then ' change to IsOrginal or IsBold
Using f As New Font(lb.Font.FontFamily, lb.Font.Size, FontStyle.Bold)
TextRenderer.DrawText(e.Graphics, iItem.GetDisplayText(), f, e.Bounds,
fg, bg, TextFormatFlags.Left Or
TextFormatFlags.VerticalCenter)
End Using
Else
' default
TextRenderer.DrawText(e.Graphics, iItem.GetDisplayText(), lb.Font, e.Bounds,
fg, bg, TextFormatFlags.Left Or
TextFormatFlags.VerticalCenter)
End If
End Sub
Результат:
Лично я не думаю, что это очень хорошая презентация. Это нестандартно, и то, что обозначает Жирный шрифт, не сразу очевидно. Однако вы можете делать с событием DrawItem
все, что захотите, например добавить графический индикатор:
Версия с зеленым плюсом четко показывает, какие из них были добавлены. Получение того, какие элементы были добавлены, также просто вопрос опроса коллекции элементов:
Dim added = myListBox.Items.
Cast(Of SimpleThing).
Where(Function(f) f.Selected).
ToArray()
person
Ňɏssa Pøngjǣrdenlarp
schedule
28.04.2016
ListBox
с относительно низкой сложностью. - person Vincent Thacker   schedule 28.04.2016