У меня есть этот код для списка владельцев, который перерисовывается слишком часто. Похоже, это связано с попыткой прокрутить событие с высоты, отличной от обычной.
Вот «наименьший код для воспроизведения проблемы», который можно вставить в чистую форму (стереть файл конструктора) - версия VB (c #, конечно, делает то же самое):
Public Class Form1
Inherits System.Windows.Forms.Form
Friend WithEvents ListBox1 As New System.Windows.Forms.ListBox
Private Sub ListBox1_DrawItem(ByVal sender As Object, ByVal e As _
System.Windows.Forms.DrawItemEventArgs) Handles ListBox1.DrawItem
If e.Index = -1 Then Exit Sub
Dim i As Integer = CType(ListBox1.Items(e.Index), Integer)
e.DrawBackground()
If i Mod 4 <> 0 Then
e.Graphics.DrawString("Item #: " & i.ToString & Space(20).Replace(" ", " <Filler>"), _
ListBox1.Font, Brushes.Black, 0, e.Bounds.Top)
Else
e.Graphics.DrawLine(Pens.Blue, 10, e.Bounds.Top + 1, 52, e.Bounds.Top + 1)
End If
e.DrawFocusRectangle()
End Sub
Private Sub ListBox1_MeasureItem(ByVal sender As Object, ByVal e As _
System.Windows.Forms.MeasureItemEventArgs) Handles ListBox1.MeasureItem
If e.Index = -1 Then Exit Sub
If CInt(ListBox1.Items(e.Index)) Mod 4 = 0 Then
e.ItemHeight = 2
End If
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
Me.ListBox1.Dock = System.Windows.Forms.DockStyle.Fill
Me.ListBox1.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable
Me.ClientSize = New System.Drawing.Size(454, 899)
Me.Controls.Add(Me.ListBox1)
For i As Integer = 0 To 500
ListBox1.Items.Add(i)
Next
End Sub
End Class
Ownerdrawn listbox рисует ОК, но у меня есть приложение, которое использует список этого стиля, это макрос-проигрыватель.
Вы можете выбрать начальную точку, затем нажать «один шаг» или «автозапуск». Конечно, во время воспроизведения макроса он уходит вниз по списку. Когда он начинает прокручиваться, он мерцает как сумасшедший , перекрашивая при попадании в предмет нестандартного размера.
Попробуйте прокрутить в этом сокращенном варианте, повторяющем проблему, - с помощью полосы прокрутки или просто положите стрелку вниз.
Есть идеи, что я делаю неправильно - без необходимости заново изобретать список? Очень признателен. (Я переделал этот вопрос, чтобы прояснить его).