Необходимо удалить флажки из списка OwnerDrawn ListView, но сохранить функциональность флажков

У меня есть собственный элемент управления списком, который показывает пользователю список уведомлений. По сути, когда приходит новое уведомление, новая запись добавляется в список, выделенный жирным шрифтом. Когда пользователь читает уведомление, оно превращается в обычный шрифт.

Единственный способ, которым я мог решить, как добиться этого, вероятно (статуса чтения), - это использовать флажки. Таким образом, в новом уведомлении будет отмечен его элемент, и когда оно будет прочитано, оно будет снято. Это работает хорошо и, кажется, достигает того, что мне нужно.

Однако мой вопрос: есть ли способ удалить рисунок флажков, но при этом сохранить функциональность в фоновом режиме. Так, например, не рисовать флажок для элемента списка, но при этом иметь возможность использовать ListView.Checkboxes = True и ListViewItem.Checked = True?

Мой элемент управления ListView отрисовывается владельцем, и код для моего события DrawItem выглядит так:

Protected Overrides Sub OnDrawItem(e As DrawListViewItemEventArgs)
    Try
        If Not (e.State And ListViewItemStates.Selected) = 0 Then
            'Draw the background for a selected item.
            e.Graphics.FillRectangle(System.Drawing.SystemBrushes.Highlight, e.Bounds)
            e.DrawFocusRectangle()
        Else
            'Draw the background for an unselected item.
            e.Graphics.FillRectangle(System.Drawing.SystemBrushes.Control, e.Bounds)
        End If

        e.DrawBackground()
        e.DrawDefault = True
        MyBase.OnDrawItem(e)

    Catch ex As Exception
        MsgBox("Exception Error: " & ex.Message, MsgBoxStyle.Critical, "Module: lsvOverdueCalls_DrawItem()")
    End Try
End Sub

Если я удалю e.DrawDefault = True, он удалит флажки, но тогда я не смогу управлять полужирным шрифтом для нового уведомления.

Любая помощь приветствуется. Спасибо


person Riples    schedule 26.04.2014    source источник
comment
Почему бы просто не определить свой собственный класс, который наследует ListViewItem? Затем вы можете добавить экземпляры этого класса в свой ListView вместо стандартных объектов ListViewItem? Затем вы можете добавить любую функциональность, которую хотите.   -  person jmcilhinney    schedule 26.04.2014
comment
@jmcilhinney это то, что я уже сделал. Это мой пользовательский класс, из которого я не знаю, как убрать флажки.   -  person Riples    schedule 26.04.2014
comment
как они будут проверены, если нет флажка, и как пользователь узнает, что отмечено, а что нет? Если у вас есть логический подэлемент, представляющий состояние Read (или New), вы можете выделить его жирным шрифтом или нет (если заголовок столбца отсутствует, элемент не будет отображаться пользователю).   -  person Ňɏssa Pøngjǣrdenlarp    schedule 26.04.2014
comment
Это твой собственный класс. Просто добавьте логическое свойство.   -  person jmcilhinney    schedule 26.04.2014
comment
Хорошо, спасибо за совет. Просто вопрос, как мне добавить в мой класс пользовательское свойство, которое влияет только на ListViewItems? Например, если бы я хотел добавить свойство Read, такое как ListViewItem.Read = True? Я знаю, как добавить свойство, влияющее на весь ListView, но не на элементы. Спасибо   -  person Riples    schedule 26.04.2014


Ответы (1)


В итоге я решил эту проблему, создав новый класс ListViewItem, который наследует ListViewItem, а затем добавил пользовательское свойство. Затем я использовал новый класс для ссылки на ListViewItem во всем коде, что позволило мне добавить новый атрибут в ListViewItem по умолчанию.

Public Class cust_ListViewItem
    Inherits ListViewItem

    Private _read As Boolean
    Private RegularFont As New Font(Me.Font.FontFamily, Me.Font.size, FontStyle.Regular)
    Private BoldFont As New Font(Me.Font.FontFamily, Me.Font.size, FontStyle.Bold)

    Public Property Read As Boolean
        Get
            Return _read
        End Get
        Set(value As Boolean)
            _read = value
            MarkAsRead()
        End Set
    End Property

    Private Sub MarkAsRead()
        If _read Then Me.Font = RegularFont Else Me.Font = BoldFont
    End Sub
End Class

Затем, чтобы вызвать мое новое свойство, я использовал следующее:

    Dim lvi As cust_ListViewItem = New cust_ListViewItem
    If Notifications(x).Read = True Then
    lvi.Read = True
    ...

Однако я также обнаружил следующее: Ссылка, которая позволяет полностью удалить флажок из отдельных элементов списка, чего я изначально и пытался добиться. Я просто добавил код в свой пользовательский класс списка и применил код к каждому элементу списка.

person Riples    schedule 28.04.2014