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

C# Discussion :

Affichage d'une List<List<MonObject>> en WPF


Sujet :

C#

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 188
    Par défaut Affichage d'une List<List<MonObject>> en WPF
    Bonjour,
    J'ai un problème d'affichage avec WPF j'ai fait une présentation d'une liste d'objet qui ont eux-même une liste d'un autre objet.
    J'ai donc fait un groupe qui contient un en-tête et une liste représenté par 2 labels et une zone de texte saisissable.

    Voici 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    using System.Windows;
     
    namespace WpfApp6
    {
        /// <summary>
        /// Logique d'interaction pour MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                DataContext = new Group[]
                    {
                        new Group
                        {
                            Name = "TestGroup111",
                            Tests = new Test[]
                            {
                                new Test { Name = "Test1", Value = 5, Symbole = "%" },
                                new Test { Name = "Test1Test", Value = 105, Symbole = "mm/s" },
                                new Test { Name = "Test1ff", Value = 15, Symbole = "i" }
                            }
                        },
                        new Group
                        {
                            Name = "TestGroup222",
                            Tests = new Test[]
                            {
                                new Test { Name = "Test2", Value = 25, Symbole = "%" },
                                new Test { Name = "Test2Test", Value = 135, Symbole = "mm/s" },
                                new Test { Name = "Test2ff", Value = 45, Symbole = "i" }
                            }
                        }
                    };
            }
        }
     
        public class Group
        {
            public string Name { get; set; }
            public Test[] Tests { get; set; }
        }
     
        public class Test
        {
            public string Name { get; set; }
            public int Value { get; set; }
            public string Symbole { get; set; }
        }
    }

    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
    <Window x:Class="WpfApp6.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfApp6"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <DataTemplate x:Key="ListBoxDataTemplate">
                <GroupBox Header="{Binding Name}">
                        <ItemsControl Name="icTodoList" ItemsSource="{Binding Tests}">
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <Grid Margin="0,0,0,5">
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition/>
                                            <ColumnDefinition/>
                                            <ColumnDefinition/>
                                        </Grid.ColumnDefinitions>
                                        <Label Content="{Binding Name}"/>
                                        <TextBox Grid.Column="1" Text="{Binding Value}"/>
                                        <Label Grid.Column="2" Content="{Binding Symbole}"/>
                                    </Grid>
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                </GroupBox>
            </DataTemplate>
            <ItemsPanelTemplate x:Key="ListBoxItemsPanelTemplate">
                <StackPanel Orientation="Vertical"/>
            </ItemsPanelTemplate>
        </Window.Resources>
        <Grid>
            <ItemsControl Name="Measure"
                          ItemsSource="{Binding}"
                          ItemTemplate="{StaticResource ListBoxDataTemplate}"
                          ItemsPanel="{StaticResource ListBoxItemsPanelTemplate}"
                          VerticalAlignment="Center"/>
        </Grid>
    </Window>

    Nom : Capture.PNG
Affichages : 733
Taille : 7,4 Ko

    Là tout est bon, ça fonctionne, tout est bien aligné joli et tout ça... Mais on me demande de mettre les groupes côte à côte plutôt que l'un sur l'autre.

    Pas de soucis réponds-je, il suffit de de changer l'orientation du StackPanel en Horizontal et hop c'est fait...

    Sur le fond, c'est fait mais non, voilà la tête des groupes...
    Nom : Capture.PNG
Affichages : 690
Taille : 5,7 Ko

    Rien n'est aligné comme avant...

    Qu'est-ce que j'ai raté ? Et surtout comment faire en sorte que ce soit tout beau tout joli mais cote à cote ???

    Merci pour vos idées.

    P.S. : Sachant qu'il y aura du multi-langue en dessous et que je ne pourrais pas fixer les tailles à l'avance.

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 921
    Par défaut
    Ah les ergonomes...
    Ils ont toujours de bonnes idées mais des fois, il faut les recadrer sur ce qu'ils imaginent et sur la réalité.
    Le libellé dont la taille peut potentiellement être beaucoup plus grande que ce qu'il avait prévu (surtout dans certaines langues) est ce avec quoi je me bats de manière régulière avec les ergonomes de ma boîte.

    Citation Envoyé par ypelissier
    Sachant qu'il y aura du multi-langue en dessous et que je ne pourrais pas fixer les tailles à l'avance.
    Les options sont variées mais n'étant pas trop familier avec WPF je ne sais pas si ces options sont réalisables
    - Jouer sur la taille du conteneur
    - Ancrer la partie gauche et la partie droite (on peut supposer que les chiffres ne changeront pas suivant la langue, par contre faut voir jusqu'à quelle longueur ils peuvent aller.
    - Définir une taille maximale pour chaque zone (même si cela revient un peu à définir une longueur fixe).
    - Il me semble qu'en WPF vous avez un truc du genre LayoutMachinCHose

  3. #3
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 940
    Par défaut
    En fait il est possible de gérer ça de façon native en WPF via la propriété SharedSizeGroup définie sur les ColumnDefinition et les RowDefinition. Tous les éléments d'une Grid possédant la même valeur de SharedSizeGroup (une string respectant, pour faire simple, le format d'une propriété, c.à.d : que des lettres, des chiffres, des underscores, ne commence pas par un chiffre) partageront leurs valeurs de layout, comme leurs valeurs de Width.

    Il me semble qu'il faut aussi définir la propriété attachée Grid.IsSharedSizeScope sur leur conteneur, par exemple l'ItemsControl ou le GroupBox de ton DataTemplate. Il est possible qu'il y ait des petites différences selon l'endroit où tu définie cette valeur. Du style : si cette valeur est "settée" sur l'ItemsControl du DataTemplate ("icTodoList") ça s'appliquera individuellement sur chaque DataTemplate, alors que si elle est "settée" sur l'ItemsControl global ("Measure") les valeurs seront communes à tous les éléments de la page ; mais je dis ça sans avoir vérifié, peut-être que tes tests me donneront tort.

    En espérant que ça réponde bien à ton besoin.

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 188
    Par défaut
    Je m'estime débutant encore sur WPF bien qu'ayant bien compris comment l'utiliser mais pas encore assez familier avec les objets.

    Je me suis également aidé de cet exemple après une recherche sur internet.

    Au lieu de mettre dans un Grid, je l'ai mis dans un DockPanel
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    <DockPanel Grid.IsSharedSizeScope="true" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="10">
    mais dans un Grid ça marche aussi...
    Au final voici le résultat :
    Nom : Capture.PNG
Affichages : 654
Taille : 4,7 Ko

    C'est exactement ce qui était recherché.

    Un grand merci Noxen

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

Discussions similaires

  1. Problème d'affichage dans une zone de liste
    Par wood_phil dans le forum IHM
    Réponses: 1
    Dernier message: 26/09/2008, 00h25
  2. Index et affichage d'une page selon liste déroulante
    Par weezer999 dans le forum Langage
    Réponses: 4
    Dernier message: 29/04/2008, 15h15
  3. Affichage d'une page selon liste déroulante
    Par cutpeter56 dans le forum Langage
    Réponses: 15
    Dernier message: 24/04/2008, 14h06
  4. Affichage dans une zone de liste
    Par poolpe dans le forum VBA Access
    Réponses: 5
    Dernier message: 26/10/2007, 09h23
  5. Réponses: 17
    Dernier message: 13/07/2006, 00h27

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