【问题标题】:Make ListView look active when it is not [duplicate]使 ListView 在不处于活动状态时看起来很活跃[重复]
【发布时间】:2015-02-23 06:08:12
【问题描述】:

假设我有一个 ListView 和一个 TextBox。我单击 ListView 中的第一项,使其被选中。然后我单击文本框。现在发生的情况是 ListView 变为非活动状态,因此所选项目背景变为浅灰色,而不是活动时的锐利蓝色。

我的问题是是否可以在 Listview 中进行选择以始终具有蓝色背景颜色。我想我记得有一个 ListView 属性,但我不记得它是什么......

【问题讨论】:

  • 将 HideSelection 设置为 false!
  • 我已经将 HideSelection 设置为 False。
  • 我查看了链接,但如果可能没有,我宁愿不使用背景颜色。但也许这是唯一的方法......
  • 好吧,谢谢。

标签: c# forms listview select


【解决方案1】:

这可能会让你开始。

首先,将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 的背景颜色参数。结果:

这不是太明显,但是正常的油漆在左边留下了 2-3px 的小间距。

我不太确定闪电是个好主意。首先,任何较浅的和默认的文本颜色都不会有足够的对比度;其次,它可以使它在一个黑暗的主题上更加——而不是更少——引人注目;最后,如果SystemColors.Highlight 在不活动时对于ListBox 来说足够好,那么对于ListView 也应该足够好。

【讨论】:

  • 谢谢,我试试看。
猜你喜欢
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多