我们说我有一个ListView和一个TextBox。我单击ListView中的第一个项目,以便它被选中。然后我单击TextBox。现在发生的事情是ListView变为非活动状态,因此所选项目背景变为浅灰色,而不是活动时的蓝色。
我的问题是,是否可以使Listview中的选择始终具有蓝色背景颜色。我想我会为此重新收集一个ListView属性,但我无法记住它是什么......
答案 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
作为背面颜色参数FillRectangle
和TextRenderer
。结果:
它不太明显,但正常的油漆在左边留下2-3px的小水沟。
我不太确定闪电是个好主意。首先,任何较轻的和默认的文字颜色都没有足够的对比度;第二,它可以使更多 - 而不是更少 - 在黑暗主题上引人注目;最后,如果SystemColors.Highlight
在ListBox
处于非活跃状态时足够好,那么ListView
就足够了。