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 :

Binding images à partir d'une source sur base de données


Sujet :

Windows Presentation Foundation

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur applications RFID
    Inscrit en
    Juin 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur applications RFID

    Informations forums :
    Inscription : Juin 2011
    Messages : 19
    Par défaut Binding images à partir d'une source sur base de données
    Bonjour à tous,

    Je travail sur un détail dans une de mes applications et ne comprends pas vraiment comment réagit le binding avec les images. J'ai une class Item qui contient une propriété PhotoPath qui est le chemin d'accès à ma photo. Ces informations sont stockés dans une table sur une instance SQL server.

    J'ai une balise dans le XMAL qui permet d'afficher la propriété PhotoPath de mon objet pour que l'utilisateur est une représentation visuelle de celui-ci. Le chemin indiqué est Images/MonImage.png (ou .jpg). Mais je n'arrive pas à afficher l'image. Il faut préciser je pense également que cet objet est intégré à une ListBox permettant d'afficher de multiples objets Item.

    Je vous donne un extrait du XMAL simplifié pour que vous puissiez vous rendre compte de la situation.

    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <ListBox>
       <ListBox.ItemTemplate>
            <DataTemplate>
                <Image Name="imageItem" Height="100" Width="100" Source="{Binding PhotoPath}" Stretch="None" />
            </DataTemplate>
       </ListBox.ItemTemplate>
    </ListBox>

    Pour finir je précise bien que j'ai défini un datacontext.

    En fait pour simplifier l'affaire, mon problème est d'afficher une image via un binding qui peut être modifiée dynamiquement. En conséquence, si quelqu'un pourrait m'expliquer comment gérer les chemins d'accès aux images svp. J'avoue que je suis un peu désorienté dans la manière dont WPF gère celles-ci avec un binding.

    Merci pour l'aide que vous pourrez m'apporter.

  2. #2
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    Bonjour boby

    Pour ton soucis, tu peux passer par une propriété telle que

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public BitmapImage GetMyImage
    {
    get 
    { new BitmapImage(new Uri("tonchemin, UriKind.AbsoluteOrRelative)); 
    }

    Tu le bindes comme tu l'as fais dans ton extrait de code
    En implémentant INotify, le changement se fera automatiquement dans ton IHM lorsque ton chemin changera.

    Sinon tu peux passer par un Converter.
    Voici un exemple

    Bon courage

    @+

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur applications RFID
    Inscrit en
    Juin 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur applications RFID

    Informations forums :
    Inscription : Juin 2011
    Messages : 19
    Par défaut
    Bonjour koyot,

    tout d'abord merci! J'ai envie de te répondre que ça marche mais ça ne marche pas tout à fait comme prévu avec ta première technique énoncée.

    Je m'explique. Cela prend en compte le changement dynamique puisque l'image change mais au lieu d'avoir la nouvelle... il n'y a plus rien! Ma question maintenant cela vient-il du format de l'image, de ces dimensions? Si tu veux je peux t'inclure des screenshots si ça peut t'aider à voir plus clair.

    Dernier point les images qui s'affichent sont des images qui avaient été chargées dans l'application comme étant des component. Cela a-t-il une influence?

  4. #4
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    Re,

    J'ai du mal à bien comprendre : tu charges par défaut une image et ensuite tu veux quelle change après une action particulière ?

    Tu as vérifié le path que tu mets ?
    Tes images sont en quel format ? Et quand tu dis qu'il n'y a plus rien, c'est à dire ? (finalement je veux bien une capture d'écran )

    Et si tu peux mettre un peu de ton code lors du changement de la propriété GetMyImage...

    @+

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur applications RFID
    Inscrit en
    Juin 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur applications RFID

    Informations forums :
    Inscription : Juin 2011
    Messages : 19
    Par défaut
    Ah je pense avoir trouvé une piste de recherche. Je crois ne pas avoir implémenté le INotify...

    Comment cela fonctionne-t-il?

  6. #6
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    Re,

    Tu mets le code suivant dans ta ViewModel

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     public event PropertyChangedEventHandler PropertyChanged;
            protected void OnPropertyChanged(string propname)
            {
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs(propname));
            }

    en implémentant l'interface INotifyPropertyChanged

    Ensuite sur chacune des propriétés, tu fais un OnPropertyChanged("NomdetaPropriété")

    Ce qui donne par exemple

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    protected string _str
    public string str
    {
    get {return _str;}
    set { _str = value ; OnPropertyChanged("str");}
    }

    Cet event permet de notifier à tous ceux qui sont abonnés (via le binding) que la source de données à changée et donc qu'il faut rafraichir l'affichage ..

    En espérant t'avoir aider...

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur applications RFID
    Inscrit en
    Juin 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur applications RFID

    Informations forums :
    Inscription : Juin 2011
    Messages : 19
    Par défaut
    Koyot,

    voici les screenshots demandés pour répondre à ta question.
    Sinon, les images sont au format .png soit en .jpg.

    Pour finir, tu as bien compris je charge une image par défaut et pour des raisons de personnalisation on peut être amené à changer cette image. Donc lorsque cela est changé dans la bdd il doit y avoir une répercussion sur l'appli.

    Mais comme tu viens de me le demander à propos du bout de code lors du changement de propriété... cela me fait penser que je l'ai pas implémenté donc le soucis doit sans doute venir de là...
    Images attachées Images attachées   

  8. #8
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    Pour si tes images préchargées sont de la même extension/taille/format/... il n'y a pas de raison que ça ne marche pas ...

    Essaie avec le INotify ça peut aider

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur applications RFID
    Inscrit en
    Juin 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur applications RFID

    Informations forums :
    Inscription : Juin 2011
    Messages : 19
    Par défaut
    Koyot,

    Merci pour ton aide. C'est bon ça marche avec des images "préchargés" (si par préchargés tu entends ajoutées dans visual studio dans l'onglet que je mets en PJ) dans l'application.

    Par contre si j'ajoute des images et qu'elles ne sont pas préchargés cela ne marche pas. Ma dernière question sera donc : est-il possible de gérer le cas non préchargé?
    Images attachées Images attachées  

  10. #10
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    Si tu veux brancher une image externe oui, ça doit marcher à partir du moment ou le path est correct.

    Les images qui sont chargées de base lors du lancement de ton application sont-elles intégrées dans ton projet (comme sur ta miniature) ou externe (fichier physique sur le disque) ?

    Vérifie ton path dans ta prorpiété GetMyImage peut être

  11. #11
    Membre averti
    Homme Profil pro
    Ingénieur applications RFID
    Inscrit en
    Juin 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur applications RFID

    Informations forums :
    Inscription : Juin 2011
    Messages : 19
    Par défaut
    En fait toutes les images sont dans le même dossier Images. Il y en a des préchargées et d'autres non (fichier physique sur le disque). Avec les préchargées ca marche tout le temps. Avec les autres non. Pourtant le Path sont bons je ne comprends pas du coup...

    Edit
    Désolé je n'ai que partiellement répondu à ta question. Au chargement, les images sont intégrées au projet.

  12. #12
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    Bon je viens de tester chez moi :

    View.xaml :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <Image x:Name="img" Source="{Binding Path=bmp}" />
            <Button Content="Test" Click="Button_Click" Width="50" Height="30" VerticalAlignment="Bottom"/>

    View.xaml.cs :

    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
    //la propriété
    private BitmapImage _bmp;
    public BitmapImage bmp
    {
    	get
    	{
    		return _bmp;                
    	}
    	set 
    	{ 
    		_bmp = value; 
    		OnPropertyChanged("bmp"); 
    	}
    }
     
    //le constructeur
    public MainWindow()
    {
    	InitializeComponent();            
    	DataContext = this;
    	bmp = new BitmapImage(new Uri(@"C:\photo.png", UriKind.RelativeOrAbsolute));
    }
     
    //changement au click
     private void Button_Click(object sender, RoutedEventArgs e)
      {
     bmp = new BitmapImage(new Uri(@"C:\photo2.png", UriKind.RelativeOrAbsolute));
    }


    Essaie de voir les différences par rapport à toi ...
    En espérant que cette fois tu arrives à faire ce que tu veux

  13. #13
    Membre averti
    Homme Profil pro
    Ingénieur applications RFID
    Inscrit en
    Juin 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur applications RFID

    Informations forums :
    Inscription : Juin 2011
    Messages : 19
    Par défaut
    Après avoir regarder ton code, je l'ai adapté au mien cela fonctionne dans mon application quand je déclare le path de la même manière que toi même avec des images non préchargées. Sauf avec une (très grande peut être que les dimensions jouent un rôle...). J'aurai quelques modifs à effectuer lundi pour gérer directement le path depuis la bdd. Je tiens au courant sur la finalité de la fonctionnalité. En tout cas merci pour les tuyaux et bon w-e. @+

  14. #14
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour bobybob06
    Pour de grandes dimensions cela consomme de la memoire inutimelemnt et mets du temps au chargement du bitmap....Pour diminuer la consommation memoire tu peux redimensionner l'image à une taille reduite au chargement...
    avec soit DecodePixelWidth ou soit DecodePixelHeight
    le code xaml:
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <Image Width="200">
      <Image.Source>
        <!-- To save significant application memory, set the DecodePixelWidth or  
         DecodePixelHeight of the BitmapImage value of the image source to the desired 
         height and width of the rendered image. If you don't do this, the application will 
         cache the image as though it were rendered as its normal size rather then just 
         the size that is displayed. -->
        <!-- Note: In order to preserve aspect ratio, only set either DecodePixelWidth
             or DecodePixelHeight but not both. -->
        <BitmapImage DecodePixelWidth="200"  
         UriSource="C:\Documents and Settings\All Users\Documents\My Pictures\Sample Pictures\Water Lilies.jpg" />
      </Image.Source>
    </Image>
    bon code...............

  15. #15
    Membre averti
    Homme Profil pro
    Ingénieur applications RFID
    Inscrit en
    Juin 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur applications RFID

    Informations forums :
    Inscription : Juin 2011
    Messages : 19
    Par défaut
    Merci Mabrouki pour ces précisions d'optimisation.

    Koyot, c'est bon j'ai adapté le code cela fonctionne bien avec un chemin absolu mais j'ai toujours des problèmes avec le relatif... Va savoir. Je vais donc travailler en absolu tout le temps je pense. Si tu as une piste pour résoudre cela sinon je vais marqué résolu pour le topic.

    Merci à tous!

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/06/2009, 11h49
  2. Insérer une photo sur base des donnes
    Par octal2007 dans le forum VB.NET
    Réponses: 9
    Dernier message: 22/04/2008, 14h41
  3. [VB.net 2005] Extraire un binary image à partir d'une base access
    Par WriteLN dans le forum Accès aux données
    Réponses: 1
    Dernier message: 29/01/2007, 09h23
  4. [FLASH 8] Afficher des images à partir d'une base de données
    Par developpeur_mehdi dans le forum Flash
    Réponses: 9
    Dernier message: 15/03/2006, 10h43
  5. afficher une image à partir d'une base de données access
    Par zidenne dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/11/2005, 11h41

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