Вы можете переопределить событие с помощью WNDPROC в элементе управления (пользовательский элемент управления, т. Е. Открытый класс CustomListView наследует ListView), чтобы запретить окну принимать включение / отключение. Затем вы также должны переопределить OnEnableChanged, чтобы вы могли изменить свои собственные цвета. Похоже, что когда вы снова включите и вернетесь к своим исходным / стандартным цветам, он также обновит пользовательские цвета, так что это работает здесь. Вы, вероятно, можете продвинуться дальше, чем это (вероятно, только для чтения), если вам требуется, чтобы он был включен / отключен индивидуально, но потому что, когда вы отключаете всю форму, вы все равно не можете взаимодействовать с ListView, что делает это решение ОК для меня без дополнительного кодирования .
Protected Overrides Sub OnEnabledChanged(e As System.EventArgs)
MyBase.OnEnabledChanged(e)
If Me.Enabled Then
Me.ForeColor = Color.White
Me.BackColor = Color.Black
Else
Me.ForeColor = Color.FromArgb(255, 200, 200, 200)
Me.BackColor = Color.FromArgb(255, 35, 35, 35)
End If
End Sub
Protected Overrides Sub WndProc(ByRef m As Message)
Select Case m.Msg
Case &HA 'WM_ENABLE
' Prevent the message from reaching the control,
' so the colors don't get changed by the default procedure.
Exit Sub ' <-- suppress WM_ENABLE message
Case Else
MyBase.WndProc(m)
Exit Select
End Select
End Sub
Это приводит к:
И поскольку мы изменяем цвет переднего плана на нормальный, он обновляет вид списка, который я предполагаю, в результате чего все остальные цвета возвращаются к нормальному, как показано на рисунке выше в моем вопросе.
Это может быть не чисто, но я надеюсь, что это поможет кому-то начать в правильном направлении.