none
Style sur ListBoxItem non pris en compte sur premier élément RRS feed

  • Question

  • Bonjour,

    Je me bats avec les styles sur les ListBoxItem. Je débute en WPF et je ne vois plus trop où chercher. J'ai donc une ListBox dans un UserControl, et j'ai créé un style sur la ListBox et les ListBoxItem. A l'exécution, le premier élément (premier ListBoxItem) ne prend pas en compte le style, et pas de problème pour les suivants. Je n'arrive pas à comprendre pourquoi.

    Est-ce que quelqu'un a une idée sur la cause probable du soucis ?

    Pour info, l'application est développée avec Caliburn.Micro comme framework pour mise en œuvre du MVVM.

    Merci d'avance de vos réponses.

    B.L.

    mardi 3 avril 2012 17:48

Réponses

  • J'ai trouvé une solution. J'en profite pour me répondre à moi-même, des fois que ça puisse servir pour quelqu'un d'autre !

    Il s'agit a priori d'un comportement de WPF (bug ?) : il ne prend pas en compte le style pour le premier item d'une liste lorsqu'il est déclaré directement dans un <ResourceDictionary.MergedDictionaries>.

    Il faut donc sortir la déclaration du style dans un autre fichier de ressources et y faire référence dans le <ResourceDictionary.MergedDictionaries> :

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d">
      <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Sources="Resources\MyResourceFile.xaml">
      </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>

    Il n'y a plus qu'à mettre la déclaration du style dans MyResourceFile.xaml et ça marche.

    Pour info, la source de la solution : http://stackoverflow.com/questions/4811884/wpf-doesnt-apply-style-to-first-element

    B.L.


    • Marqué comme réponse bl4456 mercredi 11 avril 2012 08:26
    mercredi 11 avril 2012 08:26

Toutes les réponses

  • Bonjour,

    Serait il possible de voir le style de la ListBox et du ListBoxItem ?


    Cordialement, Pascal.

    Développeur Wpf/SilverLight/WinPhone7

    mardi 3 avril 2012 18:36
    Modérateur
  • Voici le code de la ListBox :

    <ListBox x:Name="Items"  
             SelectionMode="Single" 
             DockPanel.Dock="Top" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <ContentControl cal:View.Context="List"  
                                cal:View.Model="{Binding}" />
            </DataTemplate> 
        </ListBox.ItemTemplate>
     </ListBox>

    cal est la déclaration de namespace pour Caliburn.Micro

    C'est le UserControl ci-dessous qui correspond à chaque ListBoxItem :

    <UserControl x:Class="Moneweb.Samples.Wpf.Views.EntiteBase.List"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300">
      <Grid>
        <Grid.ColumnDefinitions>
          <ColumnDefinition SharedSizeGroup="IdColumn" />
          <ColumnDefinition SharedSizeGroup="LibelleColumn" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
          <RowDefinition />
        </Grid.RowDefinitions>
        <TextBlock x:Name="Id" 
                   Grid.Row="0"
                   Grid.Column="0"
                   VerticalAlignment="Center" 
    			   />
        <TextBlock x:Name="Libelle" 
                   Grid.Row="0"
                   Grid.Column="1"
                   VerticalAlignment="Center" 
                   />
      </Grid>
    </UserControl>

    Enfin, les styles sont définis dans un fichier ResourceDictionnary :

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d">
      <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary>
    ...
        <Style TargetType="{x:Type ListBox}">
            <Setter Property="AlternationCount" Value="2" />
          </Style>
    
          <Style TargetType="{x:Type ListBoxItem}">
    
            <Setter Property="Padding" Value="12,0,0,0"/>
            <Style.Triggers>
              <Trigger Property="ItemsControl.AlternationIndex"  	
      					Value="0">
                <Setter Property="Background" Value="#dfe2e5" />
              </Trigger>
              <Trigger Property="ItemsControl.AlternationIndex"  	
      					Value="1">
                <Setter Property="Background" Value="#fff"/>
              </Trigger>
    
              <Trigger Property="IsMouseOver" Value="true">
                <Setter Property = "Background" Value="#abbdc9"/>
                <Setter Property = "Foreground" Value="#2f4d69"/>
                <Setter Property = "FontWeight" Value="Bold"/>
              </Trigger>
    
            </Style.Triggers>
    
          </Style>
    ...
        </ResourceDictionary>
      </ResourceDictionary.MergedDictionaries>
    
    </ResourceDictionary>

    J'espère que ça peut aider...

    B.L.


    mercredi 4 avril 2012 09:17
  • J'ai trouvé une solution. J'en profite pour me répondre à moi-même, des fois que ça puisse servir pour quelqu'un d'autre !

    Il s'agit a priori d'un comportement de WPF (bug ?) : il ne prend pas en compte le style pour le premier item d'une liste lorsqu'il est déclaré directement dans un <ResourceDictionary.MergedDictionaries>.

    Il faut donc sortir la déclaration du style dans un autre fichier de ressources et y faire référence dans le <ResourceDictionary.MergedDictionaries> :

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d">
      <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Sources="Resources\MyResourceFile.xaml">
      </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>

    Il n'y a plus qu'à mettre la déclaration du style dans MyResourceFile.xaml et ça marche.

    Pour info, la source de la solution : http://stackoverflow.com/questions/4811884/wpf-doesnt-apply-style-to-first-element

    B.L.


    • Marqué comme réponse bl4456 mercredi 11 avril 2012 08:26
    mercredi 11 avril 2012 08:26
  • Surprenant ;-)

    Merci pour l'info (à surveiller)


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    mercredi 11 avril 2012 17:21