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

Windows Presentation Foundation Discussion :

Insertion dynamique d'images dans un conteneur - WrapPanel ?


Sujet :

Windows Presentation Foundation

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Insertion dynamique d'images dans un conteneur - WrapPanel ?
    Bonjour à tous,

    J’insère dynamiquement beaucoup (+ de 800) d'objets Image dans un objet qui peut les contenir.
    Je pense utiliser un WrapPanel, (qui doit être à priori l'équivalent du FlowLayoutPanel en WindowsForm je pense)

    D'après vous, est-ce le meilleur conteneur pour ce type manipulation ? Quel genre d'optimisation puis-je faire pour que l'application ne soit pas ralentie ?

    Merci pour votre aide

    Note : je début en WPF

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Le container utilisé dépend surtout de la présentation souhaitée. Si tu veux afficher les images en lignes, effectivement WrapPanel est bien adapté (UniformGrid pourrait aussi faire l'affaire). Tu peux créer les contrôles Image 1 par 1 et les ajouter au panel.

    Après, une solution plus dans l'esprit WPF serait d'utiliser un ItemsControl où tu mets le WrapPanel comme ItemsPanel, et de binder l'ItemsSource à une liste d'images.

    Par contre, dans un cas comme dans l'autre, tu risques de rencontrer des problèmes de performances : charger 800 images en mémoire, c'est très lourd... En utilisant une ListBox ou ListView sans remplacer le panel par défaut (qui est un VirtualizingStackPanel), tu profites de la virtualisation, c'est à dire que seuls les éléments effectivement visibles à un moment donnés sont créés dans l'interface. Mais dans ce cas tu n'as plus la présentation souhaitée... Et si tu utilises un WrapPanel, la virtualisation ne fonctionne plus : il n'y a malheureusement pas de VirtualizingWrapPanel.

    Bref, à ma connaissance il n'y a pas vraiment de solution simple... tu pourrais essayer de gérer toi-même le scroll pour ne charger que les images visibles, mais c'est pas très facile

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Points : 369
    Points
    369
    Par défaut
    Tu peux trouver un virtualwrappanel ici par exemple :
    CODEPLEX

    Et avec l'aide de ce lien ça devrait le faire :
    ICI

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par NejNej Voir le message
    Tu peux trouver un virtualwrappanel ici par exemple :
    CODEPLEX
    Sympa, il faudrait que je l'essaie... tu sais ce qu'il vaut ?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci à vous 2 pour vos réponses,

    La solution serai donc de construire un dérivé d'un WrapPanel afin que seul les éléments affichés soit chargés en le rendant virtuel !

    NejNej, j'ai essayé de tester le code du premier lien, mais au lancement il m'affiche cette erreur :
    La clé donnée était absente du dictionnaire.
    Qui correspond à ces lignes, à la déclaration de layoutInfo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     protected override Size ArrangeOverride(Size finalSize)
            {
                if (_children != null)
                {
                    foreach (UIElement child in _children)
                    {
                        var layoutInfo = _realizedChildLayout[child];
                        child.Arrange(layoutInfo);
                    }
                }
                return finalSize;
            }
    Si j'analyse la méthode, il fait une boucle en analysant 1 par 1 les éléments qui y sont présent, il y'a la liste des éléments dans _realizedChildLayout de type Dictionary, la clé correspond au nom de l'élément pour l'identifier (arrêtez moi si je me trompe), et la valeur à la largeur et la hauteur de l'élément.


    Mon code dans la fenêtre est le suivant :
    J’ai compris les imports dans les fenêtres xaml, donc xmlns:local3="clr-namespace:MyWinCollection"

    Ensuite je créer l'objet comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <local3:VirtualizingWrapPanel Height="100" HorizontalAlignment="Left" x:Name="wrapPanel1" VerticalAlignment="Top" Width="200"
                                          CanVerticallyScroll="True">
                <Image Height="150" Name="image1" Stretch="Fill" Width="200" Source="Img/monimage.jpg" />
            </local3:VirtualizingWrapPanel>
    Quand j'efface l'image, sa marche, normal ^^ vu qu'il n'y a pas d'élément il n'exécute pas ce code

    Ais-je oublié quelque chose ? Une propriété ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Points : 369
    Points
    369
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Sympa, il faudrait que je l'essaie... tu sais ce qu'il vaut ?
    Moyen visiblement je galère avec un gros problème de fuite mémoire.

Discussions similaires

  1. Insertion dynamique d'images dans crystal report avec c# 3.5
    Par devvanjier dans le forum Windows Forms
    Réponses: 0
    Dernier message: 08/12/2009, 18h35
  2. Réponses: 3
    Dernier message: 02/06/2008, 08h42
  3. Insertion d'une image dans du texte dynamique
    Par djp_phillips dans le forum Flash
    Réponses: 10
    Dernier message: 18/03/2007, 19h34
  4. [html] insertion d 1 image dans une cellule avec taille en %
    Par hijodelanoche dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 19/01/2006, 00h50
  5. Insertion d'une image dans la une base mysql...
    Par Angeldu74 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 01/06/2005, 14h00

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