使ListView看起来不活跃

时间:2014-12-25 15:22:50

标签: c# forms listview select

我们说我有一个ListView和一个TextBox。我单击ListView中的第一个项目,以便它被选中。然后我单击TextBox。现在发生的事情是ListView变为非活动状态,因此所选项目背景变为浅灰色,而不是活动时的蓝色。

我的问题是,是否可以使Listview中的选择始终具有蓝色背景颜色。我想我会为此重新收集一个ListView属性,但我无法记住它是什么......

1 个答案:

答案 0 :(得分:2)

这可能会让你开始。

首先,将OwnerDraw设置为true,将HideSelection设置为False。然后,我们需要摆弄一些事件。 OwnerDraw可以是一件苦差事,因为这意味着你必须处理所有项目,子项目和列标题绘图。幸运的是,对于你想要的东西来说也不错:

// do the default
private void ListView1_DrawColumnHeader(object sender, 
     DrawListViewColumnHeaderEventArgs e)
{
    e.DrawDefault = true;
}

由于Item.Text也是SubItem(0),您可以跳过DrawItem并只回复DrawSubItem

private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
    if (!object.ReferenceEquals(this.ActiveControl, listView1) && (e.ItemIndex != -1)) 
    {
        // ToDo offer an early exit if HideSelection is false (?)
        if (e.Item.Selected) 
        {
            e.Graphics.FillRectangle(new SolidBrush(SystemColors.Highlight), 
                                     e.Bounds);

            TextRenderer.DrawText(
                      e.Graphics, " " + listView1.Items(e.ItemIndex).SubItems(e.ColumnIndex).Text, 
                      listView1.Font, e.Bounds, 
                      SystemColors.HighlightText, SystemColors.Highlight, 
                      TextFormatFlags.Left | TextFormatFlags.VerticalCenter
                      );

             // default method seems off a little
            //e.DrawText(TextFormatFlags.Left Or TextFormatFlags.VerticalCenter)
        } else {
            e.DrawDefault = true;
        }
    } else {
        e.DrawDefault = true;
    }
}

注意:

我没有注意到它被标记为C#直到我编码之后,所以VB的翻译可能会在这里和那里稍微偏离。它填充比默认绘制操作稍大的矩形。我明天会不再那么重新检查。

按原样,它使用默认的SystemColors。因为它有焦点,我认为它可能会稍微减轻背面的颜色,所以 看起来不同于聚焦与否。看看你是否喜欢这个结果:

Private Function LightenColor(clr As Color, amt As Double) As Color
    Dim R, G, B As Integer

    R = Convert.ToInt32(Math.Min(255, clr.R + 255 * amt))
    G = Convert.ToInt32(Math.Min(255, clr.G + 255 * amt))
    B = Convert.ToInt32(Math.Min(255, clr.B + 255 * amt))

    Return Color.FromArgb(clr.A, R, G, B)

End Function

转换为C#后,使用它来定义一个新的较轻的颜色:

// small values make a BIG difference
Color InActiveHighlight = LightenColor(SystemColors.Highlight, 0.15);

然后使用InActiveHighlight作为背面颜色参数FillRectangleTextRenderer。结果:

enter image description here

它不太明显,但正常的油漆在左边留下2-3px的小水沟。

我不太确定闪电是个好主意。首先,任何较轻的和默认的文字颜色都没有足够的对比度;第二,它可以使更多 - 而不是更少 - 在黑暗主题上引人注目;最后,如果SystemColors.HighlightListBox处于非活跃状态时足够好,那么ListView就足够了。