Couleur WPF ListBox élément basé sur une propriété
J'ai observer une collection d'objets de la Chanson. Ces objets de la chanson ont une propriété appelée "Jeu" qui est un bool (mauvais nommage, je sais). Les chansons afficher dans une ListBox dans mon application. Je veux la chanson qui joue à être de couleur rouge. J'ai travaillé avec des déclencheurs toute la journée à essayer de faire ce travail. Jusqu'à présent, j'ai obtenu au point où ils sont colorées en fonction de ce que le Jeu est réglé lors de la chanson est ajoutée à la liste. Est-il possible de faire changer lors de la Lecture des modifications de la propriété?
Voici mon code XAML:
<Window x:Class="MusicPlayer.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:MusicPlayer="clr-namespace:MusicPlayer" Title="Music" Height="350" Width="525" Name="Main">
<Grid>
<ListBox HorizontalAlignment="Stretch" Name="Playlist" VerticalAlignment="Stretch" Margin="0,23,0,79" MouseDoubleClick="Playlist_MouseDoubleClick">
<ListBox.Resources>
<Style TargetType="ListBoxItem">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Playing}" Value="True">
<Setter Property="Background" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
<DataTemplate DataType="{x:Type MusicPlayer:Song}">
<TextBlock Text="{Binding Path=Title}"/>
</DataTemplate>
</ListBox.Resources>
</ListBox>
<Button Content="Play" Height="23" HorizontalAlignment="Center" Margin="0,0,330,20" Name="PlayButton" VerticalAlignment="Bottom" Width="75" Click="PlayButton_Click" />
<Button Content="Stop" Height="23" HorizontalAlignment="Center" Margin="0,0,165,20" Name="stopButton" VerticalAlignment="Bottom" Width="75" Click="stopButton_Click" />
<Button Content="Next" Height="23" HorizontalAlignment="Center" Margin="165,0,0,20" Name="nextButton" VerticalAlignment="Bottom" Width="75" Click="nextButton_Click" />
<Button Content="Add Songs..." Height="23" HorizontalAlignment="Center" Margin="330,0,0,20" Name="AddButton" VerticalAlignment="Bottom" Width="75" Click="AddButton_Click" />
<Button Content="Previous" Height="23" HorizontalAlignment="Center" Margin="0,0,0,20" Name="PreviousButton" VerticalAlignment="Bottom" Width="75" Click="PreviousButton_Click" />
<Button Content="Pause" Height="23" HorizontalAlignment="Center" Margin="0,0,330,20" Name="PauseButton" VerticalAlignment="Bottom" Width="75" Visibility="Hidden" Click="PauseButton_Click" />
<Menu Height="23" HorizontalAlignment="Stretch" Name="menu1" VerticalAlignment="Top">
<MenuItem Header="File">
<MenuItem Header="Quit" Click="MenuItem_Click" />
</MenuItem>
</Menu>
<Slider Height="23" HorizontalAlignment="Stretch" Margin="10,0,10,50" Name="ProgressBar" VerticalAlignment="Bottom" />
</Grid>
</Window>
Edit:
Après implementign INotifyPropertyChanged, La couleur rouge en utilisant soit au-dessus ou au-dessous de XAML. Maintenant, il ne changera pas en arrière blanche en utilisant soit la méthode. J'ai aussi eu un problème où ma méthode de lecture ne va pas changer la couleur de fond rouge, mais mon prochain méthode. Voici mon code: http://pastebin.com/EMTUpTin http://pastebin.com/LuK78zGp
Voici mon nouveau code XAML:
<Window x:Class="MusicPlayer.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:MusicPlayer="clr-namespace:MusicPlayer" Title="Music" Height="350" Width="525" Name="Main">
<Grid>
<ListBox HorizontalAlignment="Stretch" Name="Playlist" VerticalAlignment="Stretch" Margin="0,23,0,79" MouseDoubleClick="Playlist_MouseDoubleClick">
<ListBox.Resources>
<DataTemplate DataType="{x:Type MusicPlayer:Song}">
<TextBlock Text="{Binding Path=Title}">
<TextBlock.Background>
<SolidColorBrush Color="{Binding BackgroundColor}"/>
</TextBlock.Background>
</TextBlock>
</DataTemplate>
</ListBox.Resources>
</ListBox>
<Button Content="Play" Height="23" HorizontalAlignment="Center" Margin="0,0,330,20" Name="PlayButton" VerticalAlignment="Bottom" Width="75" Click="PlayButton_Click" />
<Button Content="Stop" Height="23" HorizontalAlignment="Center" Margin="0,0,165,20" Name="stopButton" VerticalAlignment="Bottom" Width="75" Click="stopButton_Click" />
<Button Content="Next" Height="23" HorizontalAlignment="Center" Margin="165,0,0,20" Name="nextButton" VerticalAlignment="Bottom" Width="75" Click="nextButton_Click" />
<Button Content="Add Songs..." Height="23" HorizontalAlignment="Center" Margin="330,0,0,20" Name="AddButton" VerticalAlignment="Bottom" Width="75" Click="AddButton_Click" />
<Button Content="Previous" Height="23" HorizontalAlignment="Center" Margin="0,0,0,20" Name="PreviousButton" VerticalAlignment="Bottom" Width="75" Click="PreviousButton_Click" />
<Button Content="Pause" Height="23" HorizontalAlignment="Center" Margin="0,0,330,20" Name="PauseButton" VerticalAlignment="Bottom" Width="75" Visibility="Hidden" Click="PauseButton_Click" />
<Menu Height="23" HorizontalAlignment="Stretch" Name="menu1" VerticalAlignment="Top">
<MenuItem Header="File">
<MenuItem Header="Quit" Click="MenuItem_Click" />
</MenuItem>
</Menu>
<Slider Height="23" HorizontalAlignment="Stretch" Margin="10,0,10,50" Name="ProgressBar" VerticalAlignment="Bottom" />
</Grid>
</Window>
Edit 2:
Je viens de remarqué que je suis d'avoir un autre problème. Si j'mettre en surbrillance les éléments avec un fond blanc, le texte est invisible. Comment puis-je résoudre ce problème?
Edit 3:
Résolu ce problème en définissant le fond de Colors.Transparent
au lieu de Colors.White
.
Vous devez vous connecter pour publier un commentaire.
Votre objet avec le Jeu bien implémenter INotifyPropertyChanged ? Si c'est le cas, votre INTERFACE utilisateur auto-mise à jour basé sur l'DataTrigger approche que vous utilisez.
Une autre approche consiste à utiliser des ViewModels au lieu de Déclencheurs (plus facile à comprendre et travailler avec - quand les choses ne se passent pas comme prévu) Un exemple
Mise à jour:
Juste regardé vos extraits de code. Une chose que j'ai trouvé - vous besoin de déclencher l'événement après vous avez appliqué la nouvelle valeur.
Aussi le dataTemplate doit être appliqué à la propriété ItemTemplate de la zone de liste
J'ai changé fondamentalement l'extrait de l'exemple que j'ai posté pour utiliser votre morceau de la classe et puis modifié le bouton cliquez pour basculer entre les 2 couleurs. (Également tourné ListView dans ListBox)
Mes listes déroulantes changer de couleur à chaque clic! 🙂
Afin de le faire revenir, ne serait-il pas également de mettre en œuvre un déclencheur pour quand
Playing
est Faux? Comme:Cela semble être la solution la plus simple pour moi. Bien sûr, vous pouvez modifier
Value="White"
pour quelle que soit la couleur que vous avez besoin.