Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WPF, Silverlight Новый топик    Ответить
 Задание другого цвета фона для ListBoxItem  [new]
thunder2
Member

Откуда:
Сообщений: 380
задался целью изменить цвет выделения в ListBox`е.
Задал стиль
<ListBox  Name="list1">
   <ListBox.ItemContainerStyle>
       <Style TargetType="{x:Type ListBoxItem}">
          <Style.Triggers>
             <Trigger Property="IsSelected" Value="True">
                  <Setter Property="Foreground" Value="Green"/>
                  <Setter Property="Background" Value = "Red"/>
             </Trigger>
          </Style.Triggers>
       </Style>
   <ListBox.ItemContainerStyle>
   <ListBoxItem>Item1</ListBoxItem>
   <ListBoxItem>Item2</ListBoxItem>
   <ListBoxItem>Item3</ListBoxItem>
   <ListBoxItem>Item4</ListBoxItem>
</ListBox>

Foreground меняется, а Background ни в какую. Покопался выяснил, что самы надежный способ изменить поведение это заменить шаблон ControlTemplate для ListBoxItem. Но когда стал рассматривать шаблон по умолчанию, то увидел, что в нем уже обрабатывается триггер на изменение свойтва IsSelected. Вот кусок
  <ControlTemplate.Triggers>
    <Trigger Property="Selector.IsSelected">
      <Setter Property="Panel.Background" TargetName="Bd">
        <Setter.Value>
          <DynamicResource ResourceKey="{x:Static SystemColors.HighlightBrushKey}" />
        </Setter.Value>
      </Setter>
      <Setter Property="TextElement.Foreground">
        <Setter.Value>
          <DynamicResource ResourceKey="{x:Static SystemColors.HighlightTextBrushKey}" />
        </Setter.Value>
      </Setter>
      <Trigger.Value>
        <s:Boolean>True</s:Boolean>
      </Trigger.Value>
    </Trigger>
...
  </ControlTemplate.Triggers>

Как видно здесь тоже задаются и Background и Foreground, тем не менее в первом стиле изменяется только Foreground, а Background первым способом изменить не получиться никак.
Почему ? Чем таким особенным является Background ?
У других элементов Background, как правило, меняется без проблем в триггере стиля.

Нашел еще один способ изменить цвет выделения:
        <ListBox Name="list1" >
            <ListBox.Resources>
                <LinearGradientBrush x:Key ="{x:Static SystemColors.HighlightBrushKey}" StartPoint="0,0" EndPoint="0,1">
                    <GradientStop Offset="0" Color="Azure"></GradientStop>
                    <GradientStop Offset="1" Color="Blue"></GradientStop>
                </LinearGradientBrush>
            </ListBox.Resources>
            <ListBoxItem>Item1</ListBoxItem>
            <ListBoxItem>Item2</ListBoxItem>
            <ListBoxItem>Item3</ListBoxItem>
            <ListBoxItem>Item4</ListBoxItem>
            <ListBoxItem>Item5</ListBoxItem>
        </ListBox>

Я так понял что здесь просто перекрыт глобальный ресурс локальным ?
Еще вопрос: в триггере ControlTemplate указываются свойства таким способом "Selector.IsSelected" или "Panel.Background". А почему они задаются именно так ? Ведь Selector и Panel абстрактные классы. Что эти записи означают ?
18 дек 11, 00:07    [11783684]     Ответить | Цитировать Сообщить модератору
 Re: Задание другого цвета фона для ListBoxItem  [new]
thunder2
Member

Откуда:
Сообщений: 380
thunder2,

Что неужели никто такие штуки не делал ?
19 дек 11, 22:35    [11792578]     Ответить | Цитировать Сообщить модератору
Все форумы / WPF, Silverlight Ответить