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 :

Images dans ListView


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 25
    Par défaut Images dans ListView
    Bonjour,

    Je crée un ListView, dans le code, et relie ce ListView aux données :
    Code : 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
    65
    66
    67
    68
    69
    70
    71
     
    Hashtable[] data;
    string[] fields;
    string[] types;
    // ... remplissage de 'data', 'fields' et 'types'
     
    ListView listView = new ListView();
     
    ArrayList arrayList = new ArrayList();
     
    // création <GridViewColumn>
    for (int i = 0; i < fields.Length; i++)
    {
       GridViewColumn gvc = new GridViewColumn();
       Binding binding = new Binding(fields[i].ToUpper());
       if ( types[i] == "date" ) binding.StringFormat = "dd/MM/yyyy HH:mm:ss";
       gvc.DisplayMemberBinding = binding;
       gvc.Header = fields[i];
       gridView.Columns.Add(gvc);
    }
     
    // création <ListView.View>
    listView.View = gridView;
     
    // rajout des données
    for (int i = 0; i < data.Length; i++)
    {
       DataObject dataObject = new DataObject();
       for (int j = 0; j < fields.Length; j++)
       {
          dataObject.store(fields[j], data[i][fields[j]]);
       }
       arrayList.Add(dataObject);
    }
    listView.ItemsSource = arrayList;
     
     
    public class DataObject 
    {
            public string title;
            public DateTime date;
            public string photo;
     
            public void store(string key, string value)
            {
                switch (key)
                {
                    case "title":
                        title = value;
                        break;
                    case "date":
                        date = DateTime.ParseExact(value, "dd/MM/yyyy HH:mm:ss", new CultureInfo("fr-FR", true), DateTimeStyles.None);
                        break;
                    case "photo":
                        photo = value;
                        break;
                  }
            }
            public string TITLE
            {
                get { return this.title; }
            }
            public DateTime DATE
            {
                get { return this.date; }
            }
            public string PHOTO
            {
                get{ return this.photo; }
            }
    }
    Presque toutes les données sont des chaines de caractères, sauf quelqu'unes qui sont des adresses URL d'images.
    Pour l'instant elles apparaissent sous forme de texte et j'aimerais qu'une image apparaissent à la place.

    J'ai essayé de modifier le type de sortie de PHOTO.get() en renvoyant un System.Windows.Controls.Image, mais alors au lieu de voir s'afficher le texte de l'URL dans le ListView, je vois apparaître le texte "System.Windows.Controls.Image" sur chaque ligne, ce qui correspond au ToString() qui est effectué.

    Je ne sais pas si ce que je désire faire est possible en conservant la méthode actuellement employée ou s'il faut utiliser une autre méthode.

    Une idée ?

    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Utilise un convertisseur, dans ton binding, qui va convertir le Path en image

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 25
    Par défaut Réponse
    Si il s'agit d'utiliser un convertisseur implémentant l'interface IValueConverter, j'ai essayé mais cela ne fonctionne pas.

    Car au moment de l'affichage la fonction ToString() est appelée, et donc je vois apparaître la chaîne de caractères "System.Windows.Controls.Image" au lieu de l'image attendue.

    N'y aurait-il pas une solution avec les DataTemplate ?

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    faut mettre une image dans le xaml en tenplate qui prend sa source
    sur le binding du nom avec le converter

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 25
    Par défaut
    Je rajoute dans le XAML l'espace de nom :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <Window 
    ...
    xmlns:local="clr-namespace:myApplication"
    ...
    Je rajoute dans <Window.Resources> :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <local:BitmapConverter x:Key="myBitmapConverter">
    </local:BitmapConverter> 
    <DataTemplate DataType="System.Windows.Media.Imaging.BitmapImage">
    <Image Source="{Binding Path=photo, Converter={StaticResource myBitmapConverter}}" />
    </DataTemplate>
    Mon convertisseur est :
    Code : 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
     
    [ValueConversion(typeof(String), typeof(System.Windows.Media.Imaging.BitmapImage))]
    public class BitmapConverter : IValueConverter
    {
       public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
       {
          string source = (string)value;
          System.Windows.Media.Imaging.BitmapImage bitmapImage = new System.Windows.Media.Imaging.BitmapImage();
          if (source.Trim().Length == 0) source = "http://mywebsite/image/nopic.jpg"; 
          bitmapImage.BeginInit();
          bitmapImage.UriSource = new Uri(source);
          bitmapImage.DecodePixelWidth = 50;
          bitmapImage.EndInit();
           return bitmapImage;
       }
       public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
       {
          throw new NotImplementedException();
       }
    }
    Je rajoute aussi dans le code décrit dans le premier post :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    binding.Converter = new BitmapConverter();
    Mais cela ne fonctionne toujours pas...

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Par défaut
    normalement le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    binding.Converter = new BitmapConverter();
    n'est pas nécessaire
    puisque le converter est instancier directement dans le xaml

    ensuite dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
       {
          string source = (string)value;
          if (source.Trim().Length == 0) source = "http://mywebsite/image/nopic.jpg"; 
    return  new Uri(source);
        }
    essai ca j'ai pas vérifié le targettype pour le moment (je vais contrôler ca)
    mais normalement dans value tu doit trouver theoriquement l'adresse lié a ton image

    de meme au niveau de ton datatemplate ca me semble etre mauvais
    t'aurais pas un visuel de ce que tu veux faire ca me donnerais une idee

Discussions similaires

  1. Problème superpositions d'images dans ListView
    Par anto2b dans le forum Composants graphiques
    Réponses: 4
    Dernier message: 18/02/2013, 19h19
  2. Image dans listview mode détail
    Par metallica14 dans le forum VB.NET
    Réponses: 1
    Dernier message: 26/07/2007, 13h23
  3. Ajouter image dans une ListView
    Par Dimitri_87 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 20/02/2007, 00h50
  4. [vb2005] Images dans Listview
    Par stargates dans le forum Windows Forms
    Réponses: 4
    Dernier message: 07/08/2006, 15h39
  5. [VB.NET][ListView]des images dans une list view
    Par pcdj dans le forum Windows Forms
    Réponses: 1
    Dernier message: 16/12/2005, 12h08

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