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

时间:2018-06-28 18:35:22

标签: .net vb.net listview listviewitem

我有一个使用VB.NET Winforms / .Net Framework 4.5.2的项目,当前正在使用ListViewBox来显示某些信息。但是,当窗口被禁用时(例如,我有一个子窗口为某些事情禁用了父窗口),它的工作效果很好,ListViewBox背景色为灰色。这是了解我的意思的示例:

Top one is enabled, bottom is disabled

如您所见,当禁用窗口时,底部图像出现。我想防止发生这种浅灰色,但我不知道如何解决。我听说过一些事情,例如将背景颜色设置为实际颜色(在这种情况下为黑色),虽然确实可以用作hack,但是添加的所有项目仍然会覆盖该颜色,因此它不起作用。

1 个答案:

答案 0 :(得分:1)

您可以在控件(一个自定义控件,即Public Class CustomListView Inherits ListView)上使用WNDPROC覆盖该事件,以防止该窗口启用/禁用。然后,您还必须覆盖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

这导致: End Result

由于我们将前景色恢复为正常,因此刷新了我认为的列表视图,导致所有其他颜色也恢复为正常,如上图所示。

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