Выбранный элемент в списке не читается из-за цвета

Я динамически создаю коллекцию стековых панелей в своем списке. В этой панели стека содержатся метки и флажки, выровненные по горизонтали.

Проблема в том, что когда я нажимаю на панель стека, выделение становится нечитаемым, потому что линия становится темно-синей, а буквы остаются черными, такими черными на синем, что вы ничего не видите. Как я могу динамически изменить передний цвет выбранных элементов в панели стека? Я говорю динамически, а не в файле xml, потому что все эти элементы динамически создаются из базы данных.

У меня есть код, похожий на этот:

foreach (var utilis in item.user)
{
    StackPanelWithID ligne = new StackPanelWithID();
    ligne.Orientation = Orientation.Horizontal;
    ligne.ID = utilis.TRIGRAMME;
    ligne.Height = 21;
    Label l = new Label();
    l.Width = 120;
    Label l2 = new Label();
    l2.Width = 145;
    CheckBox cbEntretien = new CheckBox();
}

contentpresenter не будет работать... Я попробовал несколько способов его позиционирования... Итак, я нашел способ обойти проблему... в app.xaml:

 <Application.Resources>
    <Style TargetType="{x:Type ListBoxItem}">
                        <Style.Resources>
                            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="LightBlue"/>
                        </Style.Resources>
    </Style>
</Application.Resources>

Таким образом, фон выбранных элементов становится более четким, так что пользователь все еще может читать текст выбранных элементов списка.

и каждый элемент списка касается.

и все же... я хотел бы знать, как можно изменить цвет текста выбранного элемента в списке... если мне удастся получить ответ, я буду держать вас в курсе...


Я сделал это...

<ControlTemplate TargetType="ListBoxItem">
                    <ContentPresenter>
                        <ControlTemplate.Triggers>

                            <Trigger Property="IsSelected" Value="true">

                            <Setter Property="Background"
                                        Value="Red"/>

                        </Trigger>

                    </ControlTemplate.Triggers>
                        </ContentPresenter>
                </ControlTemplate>

но все еще не работает, он говорит, что свойство триггера не может быть найдено в ControlTemplate... Я пытался добавить его после свойства триггера, но тоже не работает...


Я пробовал что-то вроде этого в App.xaml: "

<Style x:Key="SimpleListBoxItem" TargetType="ListBoxItem">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListBoxItem">
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsSelected" Value="true">
                                <Setter Property="Background" <!--can't find the text property so try to act on the Background color to set it to a different color than dark blue-->
                                            Value="Red"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>"

и в конкретном файле xaml, где находится мой список:

<ListBox Margin="9,64,8,313" Loaded="lstUtilisateurs_Loaded" Name="lstUtilisateurs" ItemContainerStyle="{StaticResource SimpleListBoxItem}"/>

но при выполнении в списке больше ничего не появляется, ничего... я не понимаю...


person Anna    schedule 24.03.2010    source источник
comment
Ваш объект создается динамически, но стиль можно задать статически. Например, вы можете использовать шаблон элемента управления в WPF.   -  person xandy    schedule 24.03.2010
comment
Когда вы говорите, что динамически создаете стековые панели для списка, вы имеете в виду, что создаете их программно?   -  person Scott J    schedule 24.03.2010
comment
Да, я имею в виду программно извините, что у меня есть что-то вроде этого: foreach (var utilis в item.user) { StackPanelWithID ligne = new StackPanelWithID(); ligne.Orientation = Ориентация.Горизонтальная; ligne.ID = utilis.TRIGRAMME; линия.Высота = 21; Метка l = новая метка(); л.Ширина = 120; Метка l2 = новая метка(); л2.Ширина = 145; CheckBox cbEntretien = new CheckBox();... Я собираюсь попробовать шаблоны, но это довольно сложно для меня..   -  person Anna    schedule 24.03.2010
comment
Да, шаблон WPF довольно сложный. Я предлагаю вам взять книгу о WPF. Механизм шаблонов на самом деле чрезвычайно мощный и с ним весело играть.   -  person xandy    schedule 25.03.2010


Ответы (1)


Не знаю, имеет ли это значение (последний ответ был 25 марта 2010 г.), но для людей, которые все еще задаются вопросом, как это сделать, я сделал это следующим образом:

В разделе «Стиль»:

    <Style x:Key="myLBStyle" TargetType="{x:Type ListBoxItem}">

        <Style.Resources>

            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent"/> <!-- makes the background color transparent, removes backcolor border-->


            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Red"/> <!-- Sets the textcolor of the selected text to red -->

        </Style.Resources>
    </Style>

В списке я использую свойство ItemContainerStyle следующим образом:

ItemContainerStyle="{StaticResource myLBStyle}

Мне потребовалось время, чтобы найти, но вот оно. Надеюсь, что кто-то может использовать его!

Также удобно:

http://msdn.microsoft.com/en-us/library/ms603164.aspx

Наилучшие пожелания,

Сэм

person sam de meyer    schedule 13.02.2011