Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Цвет выделенного элемента в ListBox / 13 сообщений из 13, страница 1 из 1
11.10.2018, 13:57
    #39716133
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет выделенного элемента в ListBox
На многих ресурсах для изменения цвета выделенного элемента предлагается изменить системные предопределённые цвета SystemColors.HighlightTextBrushKey , SystemColors.HighlightBrushKey , SystemColors.ControlBrushKey . Я проверял этот способ - но результат нулевой. Один из проверенных вариантов
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    <Grid>
        <Grid.Resources>
            <Style x:Key="myListboxStyle">
                <Style.Resources>
                    <!-- Item TextColor -->
                    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="#0505F3" />
                    <!-- Background of selected item when focussed -->
                    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#00FF3D" />
                    <!-- Background of selected item when not focussed -->
                    <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="#3F8257" />
                </Style.Resources>
            </Style>
        </Grid.Resources>
        <ListBox Style="{StaticResource myListboxStyle}">
            <ListBoxItem Content="Строка Один"/>
            <ListBoxItem Content="Строка Два"/>
            <ListBoxItem Content="Строка Три"/>
            <ListBoxItem Content="Строка Четыре"/>
            <ListBoxItem Content="Строка Пять"/>
        </ListBox>
    </Grid>


Кто может объяснить в чём причина? Есть какие-то особенности применения? Или этот метод когда-то работал, а сейчас перестал?

В данный момент для этого я использую определение стиля в ресурсах ListBox
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
            <ListBox.Resources>
                <Style TargetType="ListBoxItem">
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="true">
                            <Setter Property="Foreground" Value="Blue"/>
                        </Trigger> 
                    </Style.Triggers>
                </Style>
            </ListBox.Resources>

Правильный ли такой подход?
...
Рейтинг: 0 / 0
11.10.2018, 14:03
    #39716142
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет выделенного элемента в ListBox
шаблон ListBoxItem переопределен?
...
Рейтинг: 0 / 0
11.10.2018, 14:37
    #39716162
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет выделенного элемента в ListBox
Eld HaspКто может объяснить в чём причина? Есть какие-то особенности применения? Или этот метод когда-то работал, а сейчас перестал?
Эти цвета и эта раскраска применяется для ListBoxItem. В другой теме уже говорилось , что ListBoxItem и ListBox - это разные визуальные дереья, и ListBoxItem не может видеть ресурсы из стиля ListBox. Эти переопределенные цвета нужно помещать в стиль ListBoxItem:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<ListBox Grid.Column="2">
  <ListBox.ItemContainerStyle>
    <Style TargetType="{x:Type ListBoxItem}">
      <Style.Resources>
        <!-- Item TextColor -->
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="#0505F3" />
        <!-- Background of selected item when focussed -->
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#00FF3D" />
        <!-- Background of selected item when not focussed -->
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="#3F8257" />
      </Style.Resources>
    </Style>
  </ListBox.ItemContainerStyle>
  <ListBoxItem Content="Строка Один"/>
  <ListBoxItem Content="Строка Два"/>
  <ListBoxItem Content="Строка Три"/>
  <ListBoxItem Content="Строка Четыре"/>
  <ListBoxItem Content="Строка Пять"/>
</ListBox>


P.S. Я бы лично не стал переопределять системные цвета - это будет влиять на всё приложение. Просто сделал бы отдельный стиль для листбокса, где в триггерах бы напрямую указал, в каком случае какой цвет, и всё.
...
Рейтинг: 0 / 0
11.10.2018, 16:04
    #39716220
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет выделенного элемента в ListBox
Сон Веры ПавловныP.S. Я бы лично не стал переопределять системные цвета - это будет влиять на всё приложение. Просто сделал бы отдельный стиль для листбокса, где в триггерах бы напрямую указал, в каком случае какой цвет, и всё.То есть вариант с триггерами, который я привёл, это верное решение?Roman Mejtesшаблон ListBoxItem переопределен?Нет, весь код указан здесь полностью.
...
Рейтинг: 0 / 0
11.10.2018, 16:10
    #39716229
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет выделенного элемента в ListBox
Сон Веры ПавловныЭти цвета и эта раскраска применяется для ListBoxItem. В другой теме уже говорилось, что ListBoxItem и ListBox - это разные визуальные дереья, и ListBoxItem не может видеть ресурсы из стиля ListBox. Эти переопределенные цвета нужно помещать в стиль ListBoxItem:Самое интересное, что у кого-то до сих пор это работает в таком же виде! Вот скриншот прислали мне только что [img=]
...
Рейтинг: 0 / 0
11.10.2018, 17:09
    #39716284
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет выделенного элемента в ListBox
это зависит от выбранной темы Windows, скорее всего
...
Рейтинг: 0 / 0
11.10.2018, 18:41
    #39716328
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет выделенного элемента в ListBox
Roman Mejtesэто зависит от выбранной темы Windows, скорее всегоЯ тоже пришёл к такому мнению. Но мне прислали только скрин и не ответили на вопрос о системе, версиях VS и FW.
...
Рейтинг: 0 / 0
12.10.2018, 11:28
    #39716563
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет выделенного элемента в ListBox
Миль пардон, ошибся. Заглянул в документацию - поиск ресурсов ведется не по визуальному дереву, а по логическому, и в случае DynamicResource (в дефолтном теплейте ListBoxItem цвета адресуются именно через DynamicResource) поиск ведется и в стилях, и шаблонах.
Единственный мутный момент, плохо разъясненный в документации - вот этот:
1. The lookup process checks for the requested key within the resource dictionary defined by the element that sets the property.
- If the element defines a Style property, the Resources dictionary within the Style is checked.
- If the element defines a Template property, the Resources dictionary within the FrameworkTemplate is checked.
2. The lookup process then traverses the logical tree upward, to the parent element and its resource dictionary . This continues until the root element is reached.

- т.е. ресурсы в стилях и шаблонах ищутся только несоредственно у элемента, запрашивающего ресурс. Однако, учитывая, что вот это тоже вполне работает:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<Grid>
  <Grid.Style>
    <Style>
      <Style.Resources>
        <!-- Item TextColor -->
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="#0505F3" />
        <!-- Background of selected item when focussed -->
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#00FF3D" />
        <!-- Background of selected item when not focussed -->
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="#3F8257" />
      </Style.Resources>
    </Style>
  </Grid.Style>
  <ListBox>
    <ListBoxItem Content="Строка Один"/>
    <ListBoxItem Content="Строка Два"/>
    <ListBoxItem Content="Строка Три"/>
    <ListBoxItem Content="Строка Четыре"/>
    <ListBoxItem Content="Строка Пять"/>
  </ListBox>
</Grid>


можно сделать вывод, что документация недоговоравает - поиск в стилях и словарях делается в каждом элементе траверса поиска в логическом дереве.
Так что исходный пример вполне рабочий (и у меня он тоже работает). Системные стили и темы здесь вряд ли играют какое-то значение, т.к. в них процесс поиска заглядывает только тогда, когда ничего не нашлось ни в логическом дереве, ни в ресурсах приложения, а здесь всё вполне должно найтись. Скорее всего, где-то переопределен стандартный шаблон ListBoxItem.
...
Рейтинг: 0 / 0
12.10.2018, 13:56
    #39716661
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет выделенного элемента в ListBox
Сон Веры Павловны!
Мне дали ещё такое разъяснение.

Мой скриншот выше сделан на семерке, сейчас попробовал на десятке — тоже не работает.

Дефолтный стиль ListBoxItem на семерке:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
            <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
            <Setter Property="Padding" Value="2,0,0,0"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ListBoxItem}">
                        <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                            <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsSelected" Value="true">
                                <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
                            </Trigger>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="IsSelected" Value="true"/>
                                    <Condition Property="Selector.IsSelectionActive" Value="false"/>
                                </MultiTrigger.Conditions>
                                <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightBrushKey}}"/>
                                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}}"/>
                            </MultiTrigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

Все требуемые ключи для переопределения в наличии.

Дефолтный стиль на десятке:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
        <Style x:Key="FocusVisual">
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <SolidColorBrush x:Key="Item.MouseOver.Background" Color="#1F26A0DA"/>
        <SolidColorBrush x:Key="Item.MouseOver.Border" Color="#a826A0Da"/>
        <SolidColorBrush x:Key="Item.SelectedInactive.Background" Color="#3DDADADA"/>
        <SolidColorBrush x:Key="Item.SelectedInactive.Border" Color="#FFDADADA"/>
        <SolidColorBrush x:Key="Item.SelectedActive.Background" Color="#3D26A0DA"/>
        <SolidColorBrush x:Key="Item.SelectedActive.Border" Color="#FF26A0DA"/>
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="SnapsToDevicePixels" Value="True"/>
            <Setter Property="Padding" Value="4,1"/>
            <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
            <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="BorderBrush" Value="Transparent"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ListBoxItem}">
                        <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                            <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Border>
                        <ControlTemplate.Triggers>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="IsMouseOver" Value="True"/>
                                </MultiTrigger.Conditions>
                                <Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.MouseOver.Background}"/>
                                <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.MouseOver.Border}"/>
                            </MultiTrigger>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="Selector.IsSelectionActive" Value="False"/>
                                    <Condition Property="IsSelected" Value="True"/>
                                </MultiTrigger.Conditions>
                                <Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.SelectedInactive.Background}"/>
                                <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.SelectedInactive.Border}"/>
                            </MultiTrigger>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="Selector.IsSelectionActive" Value="True"/>
                                    <Condition Property="IsSelected" Value="True"/>
                                </MultiTrigger.Conditions>
                                <Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.SelectedActive.Background}"/>
                                <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.SelectedActive.Border}"/>
                            </MultiTrigger>
                            <Trigger Property="IsEnabled" Value="False">
                                <Setter Property="TextElement.Foreground" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

Как видим, используются другие ключи, да еще и как StaticResource вместо DynamicResource, а поскольку объявлены эти кисти ближе к дефолтному стилю, постольку они и используются.
Наверное, в этом случае проще переопределить стиль (шаблон — выше).
...
Рейтинг: 0 / 0
12.10.2018, 14:00
    #39716665
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет выделенного элемента в ListBox
Сон Веры Павловны, какое Ваше мнение на этот счёт?
Лучшее решение переопределить стиль с использованием триггеров для IsSelected и IsSelectionActive?
Или какой-то иной подход надо использовать для этого случая?
...
Рейтинг: 0 / 0
12.10.2018, 14:23
    #39716685
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет выделенного элемента в ListBox
Eld HaspМой скриншот выше сделан на семерке, сейчас попробовал на десятке — тоже не работает.
Т.е. не работает и на 7, и на 10? Или на 7 работает, на 10 не работает?
Если первое - не знаю, у меня на Win7 работает вполне нормально.
Если второе, то это легко объяснимо - static resources lookup работает только по ресурсным словарям, объявленным непосредственно в элементах, и не заглядывет в стили и шаблоны элементов, поэтому дефолтный шаблон на Win10 даже и не думает смотреть на объявленные вами стили, и на цвета внутри них. И это, кстати, еще одно доказательство того, почему переопределение системных ключей - не лучший выход: надо всегда знать, как устроен дефолтный шаблон в текущем окружении, и быть готовым к тому, что при смене версии ОС, или при очередном сервис-паке всё это вдруг перестанет работать. А вариант со стилем, где цвета заданы в триггерах, будет работать всегда.
...
Рейтинг: 0 / 0
12.10.2018, 15:00
    #39716721
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет выделенного элемента в ListBox
Eld Hasp,

я обычно такие вещи делаю через триггеры, чем долбаться с этими системными кистями и ловить баги в разных системах.
Еще хочу обратить ваше внимание на такую штуку как VisualStateManager
...
Рейтинг: 0 / 0
13.10.2018, 01:08
    #39716986
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цвет выделенного элемента в ListBox
Сон Веры ПавловныEld HaspМой скриншот выше сделан на семерке, сейчас попробовал на десятке — тоже не работает.
Т.е. не работает и на 7, и на 10? Или на 7 работает, на 10 не работает?
На 7-ке работает. Как и у Вас.Сон Веры ПавловныА вариант со стилем, где цвета заданы в триггерах, будет работать всегда.Roman Mejtesя обычно такие вещи делаю через триггерыПонял вас. Подобное надо делать через триггера. Так и буду делать.
Спасибо за советы и помощь!
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Цвет выделенного элемента в ListBox / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]