2010-02-10 5 views
1

У меня проблема с подсветкой ComboBox, которая показывает черный текст на синем фоне, когда текст для выделения должен быть белым.C# WPF - ComboBox выделяет цвет текста вопроса

У меня есть примеры ComboBox, которые используют ComboBoxItems, где Content является строкой. Комбобокс в этих случаях ведет себя так, как ожидалось, - когда выпадающее поле выпадает, если вы выделяете элемент, он отображает белый текст на синем черном фоне.

Однако у меня есть пример ComboBox, где Содержимое каждого ComboBoxItem является сеткой (сетка содержит 2 столбца - первая, которая содержит текст, а вторая строка - это поле со списком толщины линии). В этом случае, когда выпадающее поле сброшено, если вы выделите элемент, он отобразит черный текст на синем фоне вместо белого текста. Примечание: даже если я удаляю часть строки, и поэтому у меня есть только один столбец с текстом, я все еще вижу проблему.

Ближайшим, к которому я пришел для решения проблемы, является добавление ресурса в поле со списком для SystemColors.HighlightBrushKey и SystemColors.HighlightTextBrushKey, где я устанавливаю цвет кисти. Однако SystemColors.HighlightBrushKey правильно изменяет задний цвет выделения (это не то, что я хочу), и когда я пытаюсь использовать SystemColors.HighlightTextBrushKey, который, как я думал, изменит цвет текста выделенного элемента, ничего не произойдет (цвет не меняется).

Пример отредактированный код:

var combo = new ComboBox(); 

Func<double, object> build = d => 
{ 
    var grid = new Grid(); 
    grid.ColumnDefinitions.Add(new ColumnDefinition {Width = GridLength.Auto}); 

    var label = new Label {Content = d}; 
    grid.Children.Add(label); 
    Grid.SetColumn(label, 0); 

    var comboBoxItem = new ComboBoxItem {Content = grid, Tag = d}; 
    return comboBoxItem; 
}; 

combo.Items.Add(build(0.5)); 
combo.Items.Add(build(1)); 
combo.Items.Add(build(2)); 
... 

Я пробовал:

combo.Resources.Add(SystemColors.HighlightBrushKey, Brushes.Green); // this does set the back to green (but is not what I want) 
combo.Resources.Add(SystemColors.HighlightTextBrushKey, Brushes.White); // this does not change the text colour to white it stays as black 

Любая помощь приветствуется, спасибо.

ответ

2

Проблема заключается в том, что вы используете элемент управления Label, который определяет фиксированный черный передний план, который затем не наследует цвет ComboBoxItem, который изменяется на основе выделенного состояния. Если вы ничего не делаете Ярлык (использование встречается редко), подумайте о том, чтобы переключить его на TextBlock. Если вам нужно сохранить ярлык вы можете сделать что-то вроде этого явно заставить его наследовать:

<ComboBox x:Name="MyComboBox"> 
    <ComboBox.Resources> 
     <Style TargetType="{x:Type Label}"> 
      <Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBoxItem}}, Path=Foreground}" /> 
     </Style> 
    </ComboBox.Resources> 
</ComboBox> 

или, если вы предпочитаете в коде вы можете установить их по отдельности:

... 
var label = new Label { Content = d }; 
label.SetBinding(ForegroundProperty, new Binding("Foreground") { RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, typeof(ComboBoxItem), 1) }); 
grid.Children.Add(label); 
... 
+0

Спасибо за ответ, Я могу изменить TextBlock, и это отлично работает. – TheBlackKnight

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