Изменение переднего плана ListBoxItem из кода позади в WPF - PullRequest
0 голосов
/ 26 мая 2020

В WPF есть способ изменить передний план указанного c ListBoxItem из кода позади?

У меня есть этот ListBox:

    <ListBox x:Name="songsListBox" Background="{DynamicResource Gray}" Foreground="{DynamicResource TextColor}" HorizontalContentAlignment="Stretch" Style="{DynamicResource musicListBox}">
            <ListBox.ItemContainerStyle>
                    <Style TargetType="ListBoxItem" BasedOn="{StaticResource {x:Type ListBoxItem}}">
                            <EventSetter Event="MouseDoubleClick" Handler="ListBoxItem_MouseDoubleClick"/>
                            <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 ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" 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="{DynamicResource LigthGray}"/>
                                                                   <Setter Property="BorderBrush" TargetName="Bd" Value="{DynamicResource LigthGray}"/>
                                                           </MultiTrigger>
                                                           <MultiTrigger>
                                                                   <MultiTrigger.Conditions>
                                                                           <Condition Property="Selector.IsSelectionActive" Value="False"/>
                                                                           <Condition Property="IsSelected" Value="true"/>
                                                                   </MultiTrigger.Conditions>
                                                                   <Setter Property="BorderBrush" TargetName="Bd" Value="{x:Null}"/>
                                                                   <Setter Property="Background" Value="{DynamicResource LigthGray}"/>
                                                           </MultiTrigger>
                                                           <MultiTrigger>
                                                                   <MultiTrigger.Conditions>
                                                                           <Condition Property="Selector.IsSelectionActive" Value="True"/>
                                                                           <Condition Property="IsSelected" Value="true"/>
                                                                   </MultiTrigger.Conditions>
                                                                   <Setter Property="BorderBrush" TargetName="Bd" Value="{x:Null}"/>
                                                                   <Setter Property="Background" Value="{DynamicResource LigthGray}"/>
                                                           </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>
           </ListBox.ItemContainerStyle>
           <ListBox.ItemTemplate>
                   <DataTemplate>
                           <Grid>
                                   <Grid.ColumnDefinitions>
                                           <ColumnDefinition Width="35*"/>
                                           <ColumnDefinition Width="25*"/>
                                           <ColumnDefinition Width="30*"/>
                                           <ColumnDefinition Width="60"/>
                                   </Grid.ColumnDefinitions>

                                   <TextBlock Text="{Binding Name}" Padding="4,0,4,0" Grid.Column="0"/>
                                   <TextBlock Text="{Binding Artist}" Padding="4,0,4,0" Grid.Column="1"/>
                                   <TextBlock Text="{Binding Album}" Padding="4,0,4,0" Grid.Column="2"/>
                                   <TextBlock Text="{Binding Year}" Padding="4,0,4,0" Grid.Column="3"/>
                           </Grid>
                   </DataTemplate>
           </ListBox.ItemTemplate>
   </ListBox>

Этот ListBox предназначен для отображения музыки c библиотека. У меня также есть тот же ListBox для очереди.

Я хочу изменить передний план ListBoxItem, когда песня воспроизводится в обоих ListBoxes. Есть ли способ это сделать?

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

1 Ответ

0 голосов
/ 26 мая 2020

Предполагая, что модель данных имеет свойство IsPlaying, вы можете использовать следующий DataTrigger для переключения переднего плана контейнера элементов:

<ListView>
  <ListView.ItemContainerStyle>
    <Style TargetType="ListBoxItem">
      <Setter Property="Foreground" Value="Black" />

      <Style.Triggers>
        <DataTrigger Binding="{Binding IsPlaying}" Value="True">
          <Setter Property="Foreground" Value="Red" />
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </ListView.ItemContainerStyle>
</ListView>
...