2014-12-25 2 views
1

Предположим, что у меня есть ListView и TextBox. Я нажимаю на первый элемент в ListView, чтобы он был выбран. Затем я щелкните в TextBox. Теперь происходит то, что ListView становится неактивным, поэтому выбранный элемент фона становится светло-серым, а не резким синим цветом, который он имел при активном.Сделать ListView активным, если он не

Мой вопрос в том, можно ли сделать выбор в списке, чтобы всегда иметь синий цвет фона. Я думаю, что я вспоминаю свойство ListView для этого, но я не могу вспомнить, что это такое ...

+0

Это решение было разрешено здесь http://stackoverflow.com/questions/5179664/how-to-change-listview-selected-row-backcolor-even-when-focus-on-another-control –

+0

Установить HideSelection в false ! – TaW

+0

У меня уже есть HideSelection для False. – spunit

ответ

2

Это может заставить вас начать.

Сначала установите 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 , Результаты:

enter image description here

Это не слишком заметно, но нормальная краска оставляет мало желоб 2-3px на левой стороне.

Я не уверен, что облегчение - хорошая идея. Во-первых, любой светлый цвет и цвет текста по умолчанию не имеют достаточного контраста; во-вторых, это может сделать его более - не менее - заметным на темной теме; и, наконец, если SystemColors.Highlight достаточно хорош для ListBox, когда он неактивен, он должен быть достаточно хорош для ListView.

+0

Спасибо, я попробую это. – spunit

Смежные вопросы