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 :

[ItemTemplate/TreeListView] Comment afficher du texte, des images + enfants ?


Sujet :

Windows Presentation Foundation

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 612
    Points : 338
    Points
    338
    Par défaut [ItemTemplate/TreeListView] Comment afficher du texte, des images + enfants ?
    Bonjour,

    J'aimerais tout d'abord savoir si cela est possible, puis si oui avoir une petite indication sur la route a prendre(je demande pas la reponse cash mais ce sont mes 1er projet WPF...)

    J'aimerais, a partir d'un dossier contenant d'autre dossier(et ainsi de suite) afficher un arbre de ses dossier(jusqu'ici pas de problème)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    foreach(string in Directory.GetFiles(MonDossier))
        {
            tmp = new TreeViewItem();
            tmp.Header = string;
            monTreeListView.Items.Add(tmp)
            .......
        }
    avec une petite recurrence si jamais le dossier a des enfants

    le plus difficile est que j'aimerais avoir des mini vignette contenant mes images(qui sont de taille raisonnable 16x16 a 256x256) directement dans mon TreeListView

    exemple:
    definition: imgX-Y => dossier X ; image n° Y

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    -> Dossier 1
        -> Dossier 2
            -> img2-1
            -> img2-2
        -> Dossier 3
        -> img1-1
        -> img1-2
        -> img1-3

  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 : 43
    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 753
    Points
    39 753
    Par défaut
    A mon avis le mieux est que tu fasses une classe qui représente un dossier ou un fichier, et qui propose une propriété Children et une propriété Image (évaluées par rapport au chemin d'accès). Comme ça tu peux binder les objets racine (les disques par exemple) avec un HierarchicalDataTemplate, et le reste de l'arborescence devrait suivre tout seul...
    Enfin, je dis ça... c'est très théorique, je n'ai pas testé, mais ça doit pouvoir se faire

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 612
    Points : 338
    Points
    338
    Par défaut
    je viens de regarder un exemple d'utilisation et je pense a peut près comprendre l'utilisateur du HierarchicalDataTemplate mais je ne suis pas sur qu'il soit adapter ici. mon soucis majeur et que n'importe quel dossier peut avoir 2 collection

    en effet si on met tout cela sous forme de classe nous aurions

    DossierPrincipal
    - nom
    - List<DossierEnfant>

    DossierEnfant
    - nom
    - List<Image>
    - List<DossierEnfant>


    le HierarchicalDataTemplate serais (a voir l'exemple) parfais pour les listes List<DossierEnfant> mais je ne vois pas comment afficher ma liste d'image...

  4. #4
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Citation Envoyé par TheBlackReverand
    le HierarchicalDataTemplate serais (a voir l'exemple) parfais pour les listes List<DossierEnfant> mais je ne vois pas comment afficher ma liste d'image...
    Je pense que le ItemTemplateSelector peut te permettre de faire ce que tu veux.
    http://msdn.microsoft.com/fr-fr/libr...eselector.aspx

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par binoo Voir le message
    Je pense que le ItemTemplateSelector peut te permettre de faire ce que tu veux.
    http://msdn.microsoft.com/fr-fr/libr...eselector.aspx

    Ca me semble pas mal, en effet

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 612
    Points : 338
    Points
    338
    Par défaut
    ok donc se dernier utilise comme ressource une fonction ecrite en C# qui recupere l'item, effectue des test, en fonction de ceux ci va rechercher un DataTemplate specifique et le renvoy

    mais j'ai encore et toujours un problème


    il ne veut pas trouver ma class comme une ressource...
    et de plus un element(AuctionItem) n'est pas reconnus...j'ai pourtant bien ajouter PresentationFramework.dll

    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
        public class auctionItemDataTemplateSelector : DataTemplateSelector
        {
            public override DataTemplate SelectTemplate(object item, DependencyObject container)
            {
                if (item != null && item is AuctionItem)
                {
                    AuctionItem auctionItem = item as AuctionItem;
                    Window window = Application.Current.MainWindow;
     
                    switch (auctionItem.SpecialFeatures)
                    {
                        case SpecialFeatures.None:
                            return
                                window.FindResource("AuctionItem_None")
                                as DataTemplate;
                        case SpecialFeatures.Color:
                            return
                                window.FindResource("AuctionItem_Color")
                                as DataTemplate;
                    }
                }
     
                return null;
            }
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <Window x:Class="VisionneuseImage.winVisionneuse"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="The Black Reverand - Visionneuse d'Image" Height="500" Width="550">
     
        <Grid>
            <GroupBox Header="Paramétres" Name="gpbParametres" Height="91" VerticalAlignment="Top" Margin="10,10,10,0" HorizontalContentAlignment="Left" Padding="10">
                <TextBox Height="23" Name="txtDossier" Width="224" HorizontalAlignment="Left" VerticalAlignment="Top">C:\MES DONNEES\image lib temp</TextBox>
            </GroupBox>
            <TreeView Margin="10,136,200,10" Name="trvListSousDossier" ItemTemplateSelector="{StaticResource auctionItemDataTemplateSelector}" />
        </Grid>
    </Window>
    PS: le contenu de la fonction overrider et une simple copie de msdn, elle n'est pas encore personnaliser a mon projet


    merci a vous tous

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Hum.. dans ta window, je ne vois pas les ressources auxquelles tu veux accéder: AuctionItem_None et AuctionItem_Color

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 612
    Points : 338
    Points
    338
    Par défaut
    oui je n'avais pas encore personnaliser la fonction du fait que je n'arrivais même pas a y accéder (sinon il m'aurais dit "stop tu cherche une ressource qui n'existe pas")


    j'ai trouver une partie de code qui me manquer, elle me permet de fair le liens entre le C# et le XAML

    MON XAML:
    xmlns:cc="clr-namespace:VisionneuseImage" ==> me donne un acces a l'espace de nom de mon fichier C#

    ensuite dans les Windows.Resource je crèè un DataTemplate tout simple
    et enfin j'ajoute un lien vers ma classe auctionItemDataTemplateSelector en lui fournissant le DataTemplate du dessus en propriete
    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
    <Window x:Class="VisionneuseImage.winVisionneuse"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:cc="clr-namespace:VisionneuseImage"
        Title="The Black Reverand - Visionneuse d'Image" Height="500" Width="550">
     
        <Window.Resources>
            <DataTemplate x:Key="dt1" x:Name="dt1">
                <TreeViewItem Background="Black" Header="TEST" />
            </DataTemplate>
     
            <cc:auctionItemDataTemplateSelector DataTemplate1="{StaticResource dt1}" x:Key="templateSelector" />
        </Window.Resources>
     
        <Grid>
            <GroupBox Header="Paramétres" Name="gpbParametres" Height="91" VerticalAlignment="Top" Margin="10,10,10,0" HorizontalContentAlignment="Left" Padding="10">
                <TextBox Height="23" Name="txtDossier" Width="224" HorizontalAlignment="Left" VerticalAlignment="Top">C:\MES DONNEES\image lib temp</TextBox>
            </GroupBox>
            <TreeView Margin="10,136,200,10" Name="trvListSousDossier" ItemTemplateSelector="{StaticResource templateSelector}" />
        </Grid>
    </Window>
    MON C#
    on y trouve donc l'initialisation de ma forme
    le remplissage du TreeView
    la classe heritant de DataTemplateSelector
    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
    using System.Windows;
    using System.IO;
    using System.Windows.Controls;
    using System.Windows.Media.Imaging;
    using System;
     
    namespace VisionneuseImage
    {
        /// <summary>
        /// Logique d'interaction pour winVisionneuse.xaml
        /// </summary>
        public partial class winVisionneuse : Window
        {
            TreeViewItem item;
     
            public winVisionneuse()
            {
                InitializeComponent();
     
                if (Directory.Exists(txtDossier.Text))
                    Refresh();
            }
     
            private void Refresh()
            {
                // Noeud Principal
                foreach (string unFichier in Directory.GetFiles(txtDossier.Text))
                {
                    item = new TreeViewItem();
                    item.Header = unFichier;
     
                    trvListSousDossier.Items.Add(item);
                }
            }
        }
     
        public class auctionItemDataTemplateSelector : DataTemplateSelector
        {
            private DataTemplate _dataTemplate1;
            public DataTemplate DataTemplate1
            {
                get { return _dataTemplate1; }
                set { _dataTemplate1 = value; }
            }
     
            public override DataTemplate SelectTemplate(object item, DependencyObject container)
            {
                Window window = Application.Current.MainWindow;
     
                window.Title = "eelerlj";
     
                return _dataTemplate1;
            }
        }
    }
    maintenant tout le code s'execute

    resultat: la liste de mes TreeViewItem sans modification

    j'ai utiliser des BreakPoint dans ma class qui herite de DataTemplateSelector

    le curseur passe bien dans le SET mais jamais dans la fonction SelectTemplate


    merci pour votre aide


    SOURCE:
    SOURCE

    j'ai beau chercher je ne vois pas ce qui ne va pas....

  9. #9
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Salut,

    Je ne passerai pas par les TreeViewItem... as-tu essayé ça :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                // Noeud Principal
                foreach (string unFichier in Directory.GetFiles(txtDossier.Text))
                {
                    trvListSousDossier.Items.Add(unFichier);
                }

    Est-ce que ça te permet de passer dans le SelectTemplate ?

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 612
    Points : 338
    Points
    338
    Par défaut
    oui maintenant je peut personnaliser mes element en fonction d'un test mais si tout mes elements sont de type "string" comment vais je gerer mes element (Items.Add)

    car j'explore tout les dossier enfant

  11. #11
    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 : 43
    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 753
    Points
    39 753
    Par défaut
    voilà ce que je ferais :
    au lieu d'utiliser Directory.GetFiles, qui renvoie des string, j'utiliserais plutôt DirectoryInfo pour récupérer des FileSystemInfo (classe de base de FileInfo et DirectoryInfo) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                // Noeud Principal
                DirectoryInfo dir = new DirectoryInfo(txtDossier.Text);
                foreach (FileSystemInfo unFichier in dir.GetFileSystemInfos())
                {
                    trvListSousDossier.Items.Add(unFichier);
                }
    Ensuite, tu crées un DataTemplate pour FileInfo (qui affichera l'image) et un autre pour DirectoryInfo (qui affichera les enfants)

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 612
    Points : 338
    Points
    338
    Par défaut
    oui sa je suis tout a fait d'accord et j'arriver meme a le fair avec les string (je regarder si il y avais une extesion)

    mais le problème ici est que mon TreeListView contiendras des DirectoryInfo ou des FilesInfo


    comment vais je organiser la structure? je ne peut pas dir "DirectoryInfo.Items.Add(....)"

    il faut donc utiliser les TreeViewItem....

    sauf que les TreeViewItem ne reagisse pas au moment de DataTemplateSelector

    suis je stupide, très nouveau en WPF ou juste ennuyeux

    l'avantage pour moi avec cette visionneuse et de pouvoir visualiser en miniature les images des certains dossier tout en les laissant bien grouper

    (je sais on peut fair plus simple mais bon après avoir visionner DevDays2006 j'ai envie d'essayer des choses "farfelu")

  13. #13
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Citation Envoyé par TheBlackReverand
    comment vais je organiser la structure? je ne peut pas dir "DirectoryInfo.Items.Add(....)"

    il faut donc utiliser les TreeViewItem....

    sauf que les TreeViewItem ne reagisse pas au moment de DataTemplateSelector
    Tu peux le faire sans passer par les treeViewItem, tu utilises le code de tomlev ce qui va ajouter des FileSystemInfo.

    Ensuite dans le SelectTemplate, suivant ce que tu as FileInfo ou DirectoryInfo, tu utilises le DataTemplate qui va bien. et c'est dans ce DataTemplate que tu gères l'affichage :
    - si DirectoryInfo, ton dataTemplate est un TextBlock et le texte est le Name du DirectoryInfo.
    - si tu as un FileInfo, ton DataTemplate est une image dont la source est le FullName.

    ou quelque chose comme ça

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 612
    Points : 338
    Points
    338
    Par défaut
    ok sa je l'ai fait, j'ai donc maintenant une TreeListView avec des DirectoryInfo et des FileInfo

    les FileInfo sont afficher sous forme de Image et les DirectoryInfo dans des TextBox

    le problème est qu'avec ce genre d'element je ne peut generer la relation "Dossier/Sous-Dossier" et mon resultat s'affiche donc de la meme maniere que dans une ListBox

    XMAL
    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
    <Window x:Class="VisionneuseImage.winVisionneuse"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:cc="clr-namespace:VisionneuseImage"
        Title="The Black Reverand - Visionneuse d'Image" Height="500" Width="550">
     
        <Window.Resources>
            <DataTemplate x:Key="dtDossier" x:Name="dtDossier">
                <TextBlock Foreground="Red" Text="{Binding Path=Name}" />
            </DataTemplate>
            <DataTemplate x:Key="dtFichier" x:Name="dtFichier">
                <Image Height="30" Width="30" Source="{Binding Path=FullName}" />
            </DataTemplate>
     
            <cc:auctionItemDataTemplateSelector DataTemplateDossier="{StaticResource dtDossier}" DataTemplateFichier="{StaticResource dtFichier}" x:Key="templateSelector" />
        </Window.Resources>
     
        <Grid>
            <GroupBox Header="Paramétres" Name="gpbParametres" Height="91" VerticalAlignment="Top" Margin="10,10,10,0" HorizontalContentAlignment="Left" Padding="10">
                <TextBox Height="23" Name="txtDossier" Width="224" HorizontalAlignment="Left" VerticalAlignment="Top">
                    C:\MES DONNEES\16x16
                </TextBox>
            </GroupBox>
            <TreeView Margin="10,136,200,10" Name="trvListSousDossier" ItemTemplateSelector="{StaticResource templateSelector}" />
        </Grid>
    </Window>
    C#
    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
    72
    73
    74
    75
    using System.Windows;
    using System.IO;
    using System.Windows.Controls;
    using System.Windows.Media.Imaging;
    using System;
     
    namespace VisionneuseImage
    {
        /// <summary>
        /// Logique d'interaction pour winVisionneuse.xaml
        /// </summary>
        public partial class winVisionneuse : Window
        {
            public winVisionneuse()
            {
                InitializeComponent();
     
                if (Directory.Exists(txtDossier.Text))
                    Refresh();
            }
     
            private void Refresh()
            {
                DirectoryInfo racine = new DirectoryInfo(txtDossier.Text);
                trvListSousDossier.Items.Add(racine);
     
                ListerDossierEnfant(txtDossier.Text);
                ListerFichier(racine);
            }
     
            private void ListerDossierEnfant(string dossier)
            {
                foreach (string unDossierEnfant in Directory.GetDirectories(dossier))
                {
                    DirectoryInfo directoryInfo = new DirectoryInfo(unDossierEnfant);
                    trvListSousDossier.Items.Add(directoryInfo);
     
                    ListerDossierEnfant(unDossierEnfant);
                    ListerFichier(directoryInfo);
                }
            }
            private void ListerFichier(DirectoryInfo dossier)
            {
                foreach (FileInfo unFichier in dossier.GetFiles())
                    trvListSousDossier.Items.Add(unFichier);
            }
        }
     
        public class auctionItemDataTemplateSelector : DataTemplateSelector
        {
            private DataTemplate _dataTemplateDossier;
            public DataTemplate DataTemplateDossier
            {
                get { return _dataTemplateDossier; }
                set { _dataTemplateDossier = value; }
            }
     
            private DataTemplate _dataTemplateFichier;
            public DataTemplate DataTemplateFichier
            {
                get { return _dataTemplateFichier; }
                set { _dataTemplateFichier = value; }
            }
     
            public override DataTemplate SelectTemplate(object item, DependencyObject container)
            {
                Window window = Application.Current.MainWindow;
     
                if (item is DirectoryInfo)
                    return _dataTemplateDossier;
                else
                    return _dataTemplateFichier;
            }
        }
    }
    PS: question bonus, connaissez vous un control qui accepterais une List<Image>? pour afficher mes image sur ce modele

  15. #15
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Salut,

    Déjà les HierarchicalDataTemplate sont plus adaptés avec les TreeView . Ensuite là tu ajoutes les éléments par trvListSousDossier.Items.Add, donc tout est au même niveau.

    Pour ce qui est de remplir un TreeView avec un HierarchicalDataTemplate, voilà le code à mettre en place :

    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
    <Window x:Class="VisionneuseImage.winVisionneuse"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:cc="clr-namespace:VisionneuseImage"
        Title="The Black Reverand - Visionneuse d'Image" Height="500" Width="550">
     
      <Window.Resources>
        <HierarchicalDataTemplate x:Key="dtDossier" x:Name="dtDossier" ItemsSource="{Binding SubElements}">
          <TextBlock Foreground="Red" Text="{Binding Path=Name}" />
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate x:Key="dtFichier" x:Name="dtFichier" ItemsSource="{Binding SubElements}">
          <Image Height="30" Width="30" Source="{Binding Path=FullName}" ToolTip="{Binding Path=Name}" />
        </HierarchicalDataTemplate>
     
        <local:auctionItemDataTemplateSelector DataTemplateDossier="{StaticResource dtDossier}" 
                                               DataTemplateFichier="{StaticResource dtFichier}" 
                                               x:Key="templateSelector" />
      </Window.Resources>
     
        <Grid>
            <GroupBox Header="Paramétres" Name="gpbParametres" Height="91" VerticalAlignment="Top" Margin="10,10,10,0" HorizontalContentAlignment="Left" Padding="10">
                <TextBox Height="23" Name="txtDossier" Width="224" HorizontalAlignment="Left" VerticalAlignment="Top">
                    C:\MES DONNEES\16x16
                </TextBox>
            </GroupBox>
            <TreeView Margin="10,136,200,10" Name="trvListSousDossier" ItemTemplateSelector="{StaticResource templateSelector}" />
        </Grid>
    </Window>

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    using System.Windows;
    using System.IO;
    using System.Windows.Controls;
    using System.Windows.Media.Imaging;
    using System;
    using System.Collections.ObjectModel;
     
    namespace VisionneuseImage
    {
      /// <summary>
      /// Logique d'interaction pour winVisionneuse.xaml
      /// </summary>
      public partial class winVisionneuse : Window
      {
        public winVisionneuse()
        {
          InitializeComponent();
     
          if (Directory.Exists(txtDossier.Text))
            trvListSousDossier.ItemsSource = new TreeRoot(new DirectoryInfo(txtDossier.Text)).Elements;
        }
     
      }
     
      public class auctionItemDataTemplateSelector : DataTemplateSelector {
        private DataTemplate _dataTemplateDossier;
        public DataTemplate DataTemplateDossier {
          get { return _dataTemplateDossier; }
          set { _dataTemplateDossier = value; }
        }
     
        private DataTemplate _dataTemplateFichier;
        public DataTemplate DataTemplateFichier {
          get { return _dataTemplateFichier; }
          set { _dataTemplateFichier = value; }
        }
     
        public override DataTemplate SelectTemplate(object item, DependencyObject container) {
          Window window = Application.Current.MainWindow;
     
          if (((TreeElt)item).Donnees is DirectoryInfo)
            return _dataTemplateDossier;
          else
            return _dataTemplateFichier;
        }
      }
     
     
      public class TreeRoot {
        private FileSystemInfo _MaDonnee;
     
        public TreeRoot(FileSystemInfo maDonnee) {
          _MaDonnee = maDonnee;
        }
     
        public ObservableCollection<TreeElt> Elements {
          get {
            ObservableCollection<TreeElt> elt = new ObservableCollection<TreeElt>();
     
            elt.Add(new TreeElt(_MaDonnee));
     
            return elt;
          }
        }
     
      }
     
      public class TreeElt {
        private FileSystemInfo m_Donnees;
        public FileSystemInfo Donnees { get { return m_Donnees; } }
     
        private string m_Name;
        private string m_FullName;
        public string Name { get { return m_Name; } }
        public string FullName { get { return m_FullName; } }
     
        public TreeElt(FileSystemInfo donnees) {
          m_Donnees = donnees;
          m_Name = donnees.Name;
          m_FullName = donnees.FullName;
        }
     
        public ObservableCollection<TreeElt> SubElements {
          get {
            ObservableCollection<TreeElt> elements = new ObservableCollection<TreeElt>();
     
            // Liste des dossier enfants
            foreach (string unDossierEnfant in Directory.GetDirectories(m_Donnees.FullName)) {
              DirectoryInfo directoryInfo = new DirectoryInfo(unDossierEnfant);
     
              elements.Add(new TreeElt(directoryInfo));
            }
     
            // Liste des fichiers
            foreach (string unFichier in Directory.GetFiles(m_Donnees.FullName)) {
              FileInfo fileInfo = new FileInfo(unFichier);
     
              elements.Add(new TreeElt(fileInfo));
            }
     
            return elements;
          }
        }
     
      }
     
    }

    Par contre pour les fichiers, il faudra également faire un test sur l'extension par exemple pour savoir si le fichier est une image ou un autre document (.txt, ...).

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par TheBlackReverand Voir le message
    PS: question bonus, connaissez vous un control qui accepterais une List<Image>? pour afficher mes image sur ce modele
    Une ListBox avec un ItemTemplate, comme le fait l'auteur

  17. #17
    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 : 43
    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 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Thomas Lebrun Voir le message
    Une ListBox avec un ItemTemplate, comme le fait l'auteur
    Et aussi un Template tout court...
    Il me semble que la ListBox utilise par défaut un StackPanel comme conteneur pour les éléments, il faudrait un WrapPanel à la place. J'utilise le template suivant dans un de mes projets (c'est pour une ListView, mais le principe est le même...) :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        <ControlTemplate x:Key="tplWrapListView" TargetType="ListView">
            <ScrollViewer HorizontalScrollBarVisibility="Disabled" Background="{TemplateBinding Background}">
                <WrapPanel IsItemsHost="True"
                           Orientation="Horizontal"
                           Background="Transparent"/>
            </ScrollViewer>
        </ControlTemplate>

    En fait la méthode préconisée pour un ListView est de créer une vue en héritant de ViewBase, mais je ne vois pas trop l'intérêt... ça me semble beaucoup plus complexe qu'un simple template, sans apporter grand chose de plus.

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Et aussi un Template tout court...
    Il me semble que la ListBox utilise par défaut un StackPanel comme conteneur pour les éléments, il faudrait un WrapPanel à la place.
    Erf vi, en effet. Perso, je préfère partir sur un AnimatedWrapPanel mais bon, l'idée est là

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 612
    Points : 338
    Points
    338
    Par défaut
    sa marche impect!!

    il est un peut l'on a charger mais bon sa je ferais avec

    c'est a usage personnel, pour organiser une librairie d'image, comme sa je vois très vite si il ya des doublons ou autre

    donc maintenant j'ai un beau TreeView qui affiche de maniere Arboresante les dossier a partir d'un emplacement definis

    sous la liste des dossier enfant j'ai un encadrè contenant la liste les images de ce dossier


    petite question, est-il possible via le Binding de definir une propriètè avec une expression?

    j'aimerais dir a mes ListBox contenant les Image:

    ListBox.Width = TreeView.Width - ListBox.Left - 20

    en gros que ma ListBox se redimensionne de maniere a ne jamais depasser du TreeView et de maniere dynamic

    j'attend une ou 2 reponse sur cette possibilitè et je post mon code final pour un futur demandeur

    encore merci pour tout, lundi je ferai voir sa au colègue de licence qui ne jure que par C ==> "faite moi sa sous GTK+ "

  20. #20
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Citation Envoyé par TheBlackReverand
    petite question, est-il possible via le Binding de definir une propriètè avec une expression?

    j'aimerais dir a mes ListBox contenant les Image:

    ListBox.Width = TreeView.Width - ListBox.Left - 20
    Un Converter doit pouvoir faire l'affaire .


    Citation Envoyé par TheBlackReverand
    il est un peut l'on a charger mais bon sa je ferais avec
    Depuis le SP1, il est possible d'utiliser la virtualisation qui a pour effet de ne pas charger les nœuds fils avant qu'ils aient été déployés. Comment le mettre en place, c'est autre chose, je n'ai pas encore eu le temps de regarder (un jour j'aurai peut-être le temps )

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/06/2011, 01h57
  2. Réponses: 6
    Dernier message: 12/03/2010, 11h19
  3. Comment afficher en boucle des images d'un répertoire
    Par Alexandrebox dans le forum ActionScript 1 & ActionScript 2
    Réponses: 5
    Dernier message: 20/11/2008, 17h41
  4. [WebForms][Xml][Xsl] Comment eviter un décalage des images ?
    Par ekmule dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 14/12/2005, 15h07
  5. Comment afficher du texte avec swing ?
    Par meda dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 27/10/2004, 14h35

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