C # WPF - ComboBox, выделяющий цвет текста - PullRequest
1 голос
/ 10 февраля 2010

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

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

Однако у меня есть пример ComboBox, где Содержимое каждого ComboBoxItem представляет собой Grid (Grid содержит 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

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

1 Ответ

2 голосов
/ 11 февраля 2010

Проблема в том, что вы используете элемент управления Label, который определяет фиксированный черный передний план, который затем не наследует цвет ComboBoxItem, который изменяется в зависимости от выделенного состояния. Если вы не делаете ничего особенного для Label (редко), попробуйте переключить его на 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);
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...