VB.NET Winforms/.Net Framework 4.5.2 ListViewBox 禁用背景颜色

VB.NET Winforms/.Net Framework 4.5.2 ListViewBox Disable Background Color

我有一个使用 VB.NET Winforms/.Net Framework 4.5.2 的项目,我目前正在使用 ListViewBox 来显示某些信息。它工作得很好,但是,当 window 被禁用时(即我有一个 child window 禁用某些东西的 parent window)ListViewBox 背景颜色是灰色的。这是看我的意思的例子:

如您所见,底部图像是在禁用 window 时出现的。我想防止那种浅灰色的发生,但我不知道如何解决这个问题。我听说过一些方法,例如将背景颜色设置为实际颜色(在本例中为黑色),这确实可以作为 hack,但是添加的任何项目都会覆盖它,所以它不起作用。

您可以在控件(自定义控件,即 Public Class CustomListView 继承 ListView)上使用 WNDPROC 覆盖事件,以防止 window 获取 enable/disable.然后您还必须覆盖 OnEnableChanged 以便您可以更改自己的颜色。似乎当您重新启用并返回您的 original/default 颜色时,它也会刷新自定义颜色,所以它在这里起作用。如果您需要单独 enabled/disabled ,您可能会比这更高级(可能是只读的),但是因为当您禁用整个表单时,您仍然无法与 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

这导致:

并且因为我们将前景色改回正常,它刷新了我假设的列表视图,导致所有其他颜色恢复正常,如上图在我的问题中显示的那样。

它可能不是原始的,但我希望它能帮助人们朝着正确的方向开始。