IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Silverlight Discussion :

Animation Items ListBox


Sujet :

Silverlight

  1. #1
    Membre habitué Avatar de 1tsiMat
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    139
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 139
    Points : 127
    Points
    127
    Par défaut Animation Items ListBox
    Bonjour tout le monde,

    J'ai recherché sur le forum et internet et je n'ai trouvé de solutions... Si le sujet a été abordé (voir résolu) sur un autre post merci de me dire lequel ou quoi chercher sur le forum
    Voilà mon problème est assez simple mais je ne comprends pas pourquoi cela me fait cela...
    Je vous explique, j'ai une listbox où les items contiennent des données bindées (un titre, une date et un contenu)
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    63
    64
     
            <Style x:Key="newsStyle" TargetType="ListBoxItem">
                ...
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListBoxItem">
                            <Grid Background="{TemplateBinding Background}">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="*"/>
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>
                                <vsm:VisualStateManager.VisualStateGroups>
                                    ...
                                    <vsm:VisualStateGroup x:Name="SelectionStates">
                                        <vsm:VisualState x:Name="Unselected">
                                            <Storyboard>
                                                <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="newsContent" Storyboard.TargetProperty="(UIElement.Visibility)">
                                                    <DiscreteObjectKeyFrame KeyTime="00:00:00">
                                                        <DiscreteObjectKeyFrame.Value>
                                                            <Visibility>Collapsed</Visibility>
                                                        </DiscreteObjectKeyFrame.Value>
                                                    </DiscreteObjectKeyFrame>
                                                </ObjectAnimationUsingKeyFrames>
                                            </Storyboard>
                                        </vsm:VisualState>
                                        <vsm:VisualState x:Name="Selected">
                                            <Storyboard>
                                                <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="newsContent" Storyboard.TargetProperty="Visibility">
                                                    <DiscreteObjectKeyFrame KeyTime="0">
                                                        <DiscreteObjectKeyFrame.Value>
                                                            <Visibility>Visible</Visibility>
                                                        </DiscreteObjectKeyFrame.Value>
                                                    </DiscreteObjectKeyFrame>
                                                </ObjectAnimationUsingKeyFrames>
                                            </Storyboard>
                                        </vsm:VisualState>
                                    </vsm:VisualStateGroup>
                                    <vsm:VisualStateGroup x:Name="FocusStates">
                                        <vsm:VisualState x:Name="Focused">
                                            <Storyboard/>
                                        </vsm:VisualState>
                                        <vsm:VisualState x:Name="Unfocused">
                                            <Storyboard/>
                                        </vsm:VisualState>
                                    </vsm:VisualStateGroup>
                                </vsm:VisualStateManager.VisualStateGroups>
                                <StackPanel Orientation="Vertical">
                                    <StackPanel Orientation="Horizontal">
                                        <TextBlock Text="{Binding Path=Title}" FontWeight="Bold" FontFamily="Portable User Interface" d:LayoutOverrides="HorizontalAlignment" TextWrapping="Wrap" Foreground="#FFFFFFFF" Width="200" x:Name="newsTitle" RenderTransformOrigin="0.5,0.5"/>
                                        <TextBlock Width="80" Text="{Binding Converter={StaticResource DateConverter}, Path=Date}" TextWrapping="Wrap" TextAlignment="Right" Foreground="#FFFFFFFF" x:Name="newsDate"  RenderTransformOrigin="0.5,0.5"/>
                                    </StackPanel>
                                    <TextBlock x:Name="newsContent" Text="{Binding Path=Content}" TextWrapping="Wrap" Width="290" FontSize="9" Height="80" Foreground="#FFFFFFFF" Visibility="Collapsed"/>
                                </StackPanel>
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
     
        </UserControl.Resources>
        <Grid x:Name="LayoutRoot" Width="Auto" Height="Auto" Background="#FF353535">
            <ListBox x:Name="list" Background="#00353535" BorderThickness="0,0,0,0" ItemContainerStyle="{StaticResource newsStyle}"/>
        </Grid>
    </UserControl>

    Donc seuls le titre et la date sont visibles, le contenu est invisible, lorsque je clique sur l'item, le contenu apparait, lorsque je sélectionne un autre item, le contenu disparait et le contenu du nouvel item apparait.
    Seulement, lorsque je clique sur un item sur lequel j'ai déjà cliqué, le contenu n'apparait pas mais l'item s'agrandit alors je ne comprends vraiment pas pourquoi cela fait cela...

    Merci de votre aide.

    N'hésitez pas à me dire si vous voulez plus de précisions
    N'oubliez pas, si votre problème est résolu, mettez le tag
    En informatique, il n'y a pas de problème, toujours des solutions (parfois pas évidentes à trouver )

  2. #2
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Je ne sais pas si mettre du binding directement dans le style est pas une très bonne idée.

    En fait pour faire ce que tu veux faire passer par un Template n'est peut-être pas la meilleure idée.

    Perso j'aurais spécifié le DataTemplate de l'ItemTemplate en mettant mes contrôles et mon binding. Je me serai abonné à SelectionChanged et j'aurais réalisé mes animations en code behind.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  3. #3
    Membre habitué Avatar de 1tsiMat
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    139
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 139
    Points : 127
    Points
    127
    Par défaut
    J'avais fait comme cela au début, mais mon "newsContent" n'était pas visible dans mon code puisqu'il était situé dans le DataTemplate :/

    Ou alors si tu sais comment y accéder
    N'oubliez pas, si votre problème est résolu, mettez le tag
    En informatique, il n'y a pas de problème, toujours des solutions (parfois pas évidentes à trouver )

  4. #4
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par 1tsiMat Voir le message
    Ou alors si tu sais comment y accéder
    Attention le code

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    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
        private void test_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            StackPanel sp = GetChild<StackPanel>(test) as StackPanel;
     
            int index = list.ToList().IndexOf((int)e.AddedItems[0]);
     
            ListBoxItem item = sp.Children[index] as ListBoxItem;
            TextBlock t = GetChild<TextBlock>(item);
        }
     
        public T GetChild<T>(DependencyObject obj) where T : DependencyObject
        {
            DependencyObject child = null;
     
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
            {
                child = VisualTreeHelper.GetChild(obj, i);
                if (child != null && child.GetType() == typeof(T))
                {
                    break;
                }
                else if (child != null)
                {
                    child = GetChild<T>(child);
                    if (child != null && child.GetType() == typeof(T))
                    {
                        break;
                    }
                }
            }
            return child as T;
        }

    Dans mon exemple le DataTemplate de ma ListBox c'est ça.

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <ListBox x:Name="test" SelectionChanged="test_SelectionChanged">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <TextBlock Text="{Binding}" />
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  5. #5
    Membre habitué Avatar de 1tsiMat
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    139
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 139
    Points : 127
    Points
    127
    Par défaut
    Ok merci, je test ca
    N'oubliez pas, si votre problème est résolu, mettez le tag
    En informatique, il n'y a pas de problème, toujours des solutions (parfois pas évidentes à trouver )

  6. #6
    Membre habitué Avatar de 1tsiMat
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    139
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 139
    Points : 127
    Points
    127
    Par défaut
    Salut j'ai testé ton code, cela fonctionne, mais malheureusement cela me fait le même effet qu'avec mon code bidouillé

    Je pense que cela est du au fait qu'une fois la selectionChanged, je passe le textblock de l'item removed à collapsed mais je ne comprends vraiment pas pourquoi cela réagit comme ca ensuite...

    Voilà les modifications que j'ai apporté
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    63
    64
    private void list_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                StackPanel sp = GetChild<StackPanel>(newsList) as StackPanel;
     
                int index = newsList.Items.ToList().IndexOf(e.AddedItems[0]);
     
                if (e.RemovedItems.Count > 0)
                {
                    int indexToRemove = newsList.Items.ToList().IndexOf(e.RemovedItems[0]);
                    ListBoxItem itemToRemove = sp.Children[indexToRemove] as ListBoxItem;
                    TextBlock textToRemove = GetNewsContent<TextBlock>(itemToRemove);
                    textToRemove.Visibility = Visibility.Collapsed;
                }
     
                ListBoxItem item = sp.Children[index] as ListBoxItem;
                TextBlock t = GetNewsContent<TextBlock>(item);
                t.Visibility = Visibility.Visible;
            }
     
            public T GetChild<T>(DependencyObject obj) where T : DependencyObject
            {
                DependencyObject child = null;
     
                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
                {
                    child = VisualTreeHelper.GetChild(obj, i);
                    if (child != null && child.GetType() == typeof(T))
                    {
                        break;
                    }
                    else if (child != null)
                    {
                        child = GetChild<T>(child);
                        if (child != null && child.GetType() == typeof(T))
                        {
                            break;
                        }
                    }
                }
                return child as T;
            }
     
            public T GetNewsContent<T>(DependencyObject obj) where T : DependencyObject
            {
                DependencyObject child = null;
     
                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
                {
                    child = VisualTreeHelper.GetChild(obj, i);
                    if (child != null && child.GetType() == typeof(TextBlock) && ((TextBlock)child).Name == "newsContent")
                    {
                        break;
                    }
                    else if (child != null)
                    {
                        child = GetNewsContent<T>(child);
                        if (child != null && child.GetType() == typeof(TextBlock) && ((TextBlock)child).Name == "newsContent")
                        {
                            break;
                        }
                    }
                }
                return child as T;
            }

    Mon dataTemplate :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <ListBox x:Name="newsList" Background="#00353535" BorderThickness="0,0,0,0" SelectionChanged="list_SelectionChanged">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Vertical">
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="{Binding Path=Title}" x:Name="newsTitle"/>
                                <TextBlock Width="80" Text="{Binding Path=Date}" x:Name="newsDate"/>
                            </StackPanel>
                            <TextBlock x:Name="newsContent" Text="{Binding Path=Content}"Visibility="Collapsed"/>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
    N'oubliez pas, si votre problème est résolu, mettez le tag
    En informatique, il n'y a pas de problème, toujours des solutions (parfois pas évidentes à trouver )

  7. #7
    Membre habitué Avatar de 1tsiMat
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    139
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 139
    Points : 127
    Points
    127
    Par défaut
    Ok...
    Bon bah j'ai trouvé la solution... Très bête... Ca m'énerve que ca m'ait bloqué autant de temps...
    Qu'ai-je fait pour résoudre cela?
    J'ai passé l'Opacity de mon TextBlock à 1 sur l'AddedItems en plus de mettre la Visibility à Visible... Je ne comprends vraiment pas pourquoi je dois toucher l'opacité puisque je ne la touche jamais et mettre la visibilité à visible n'est pas censé mettre les paramètres par défaut de l'objet? Enfin bref, le tout soit que la solution ait été trouvée

    Merci en tout cas Skyounet pour ta précieuse aide

    Bonne journée tout le monde
    N'oubliez pas, si votre problème est résolu, mettez le tag
    En informatique, il n'y a pas de problème, toujours des solutions (parfois pas évidentes à trouver )

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Changement de couleur item listbox
    Par breizh44 dans le forum Débuter
    Réponses: 7
    Dernier message: 06/10/2009, 09h30
  2. 2 items listbox même ligne
    Par gelwc dans le forum Excel
    Réponses: 2
    Dernier message: 01/09/2008, 09h41
  3. [C#] monter / descendre items listbox
    Par iamunknown dans le forum Windows Forms
    Réponses: 12
    Dernier message: 26/04/2006, 19h37
  4. [VB.NET] récuperer item listbox !
    Par HULK dans le forum Windows Forms
    Réponses: 6
    Dernier message: 05/07/2005, 16h38
  5. Récupération items listbox
    Par Fabiani dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 28/08/2003, 12h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo