Это может заставить вас начать.
Сначала установите OwnerDraw
в true и HideSelection
в значение False. Затем нам нужно возиться с некоторыми событиями. OwnerDraw может быть сложной задачей, потому что это означает, что вы должны обрабатывать все элементы, подэлементы и заголовок заголовка столбца. К счастью, для того, что вы хотите, это не так уж плохо:
// do the default
private void ListView1_DrawColumnHeader(object sender,
DrawListViewColumnHeaderEventArgs e)
{
e.DrawDefault = true;
}
С Item.Text
также подпозиция (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
. Так как это does not имеют фокус, я думал, что это может сработать, чтобы облегчить задний цвет немного, так что он делает выглядит другим сфокусированным против нет. Смотрите, если вам нравится результат:
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
.
Это решение было разрешено здесь http://stackoverflow.com/questions/5179664/how-to-change-listview-selected-row-backcolor-even-when-focus-on-another-control –
Установить HideSelection в false ! – TaW
У меня уже есть HideSelection для False. – spunit