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 :

Référence à un élément défini dans un ItemsPanelTemplate


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Par défaut Référence à un élément défini dans un ItemsPanelTemplate
    Bonjour,

    je souhaite utiliser une ListBox dont le ItemsPanel est un Grid :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            <ListBox Name="ListBox1">
                <ListBox.Resources>
                    <Style TargetType="ListBox">
                        <Setter Property="ItemsPanel">
                            <Setter.Value>
                                <ItemsPanelTemplate>
                                     <Grid  Name="ItemsGrid"/>
                                </ItemsPanelTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </ListBox.Resources>
            </ListBox>
    Mon problème est que j'ai besoin d'une référence à l'élément ItemsGrid dans mon code Behind.

    J'ai pensé récupérer cette référence en utilisant son événement Loaded :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <ItemsPanelTemplate>
          <Grid Name="ItemsGrid" Loaded="ItemsGrid_Loaded"/>
    </ItemsPanelTemplate>
    Cela fonctionne, mais je pense qu'il doit y avoir plus propre. Par exemple instancier le Grid en tant que StaticRessource et ensuite utiliser cette ressource pour définir le contenu de <ItemsPanelTemplate> :
    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
            <ListBox Name="ListBox1">
                <ListBox.Resources>
                    <Grid x:Key="itemsGrid" Name="ItemsGrid"/>
                    <Style TargetType="ListBox">
                        <Setter Property="ItemsPanel">
                            <Setter.Value>
                                <ItemsPanelTemplate>
                                     <!-- ICI référence à x:Key="itemsGrid"-->
                                </ItemsPanelTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </ListBox.Resources>
            </ListBox>
    Mais je ne sais pas si c'est possible et si oui quelle est la syntaxe.

  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
    Pourquoi pas faire un Custom Control ?

  3. #3
    Membre émérite
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Par défaut
    Ok, je vais regarder si je peux déclarer mon Grid dans la classe en tant que PART_ItemsGrid et donner ce nom au Grid du template...

    EDIT : la piste du Custom contrôle me parait compliquée. Le Grid définit la propriété ItemsPanel et donc le nommer PART_ItemsGrid est inutile car je ne pourrai pas le récupérer pour autant dans le code behind avec la méthode GetTemplateChild.
    Je viens de le tester. Je pense que GetTemplateChild n'explore que les éléments créés dans le ControlTemplate.

  4. #4
    Membre émérite
    Avatar de FRED.G
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 032
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 032
    Par défaut
    J'ai enfin trouvé la solution. Une vraie solution bien propre qui passe par un custom control.

    Il m'a fallu renoncer à définir le panel conteneur d'items en passant par la propriété ItemsPanel car cette propriété (malgré un nom ambigu et une syntaxe simplifiée en xaml) ne stocke pas un panel mais un modèle permettant de générer ce panel (on s'en rend d'ailleurs compte en examinant le type de la propriété ItemsPanel : ItemsPanelTemplate).

    En fait il suffit de définir le panel directement dans le ControlTemplate. Au départ, je craignais un peu de me lancer là-dedans mais j'ai pu constater que le ControlTemplate par défaut de ListBox n'est pas si monstrueux. Je l'ai donc adapté en nommant mon panel PART_ItemsGrid :
    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
            <Style  x:Key="{x:Type local:CalendarListBox}" TargetType="{x:Type local:CalendarListBox}" BasedOn="{StaticResource {x:Type ListBox}}">
     
                <Setter Property="Control.Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type local:CalendarListBox}">
                            <Border BorderThickness="{TemplateBinding Border.BorderThickness}" Padding="1,1,1,1" BorderBrush="{TemplateBinding Border.BorderBrush}" Background="{TemplateBinding Panel.Background}" Name="Bd" SnapsToDevicePixels="True">
                                <ScrollViewer Padding="{TemplateBinding Control.Padding}" Focusable="False">
                                    <Grid Name="PART_ItemsGrid" Margin="2" IsItemsHost="True" />
                                </ScrollViewer>
                            </Border>
                            <ControlTemplate.Triggers>
                                <Trigger Property="UIElement.IsEnabled" Value="False">
                                    <Setter Property="Panel.Background" TargetName="Bd">
                                        <Setter.Value>
                                            <DynamicResource ResourceKey="{x:Static SystemColors.ControlBrushKey}" />
                                        </Setter.Value>
                                    </Setter>
                                </Trigger>
                                <Trigger Property="ItemsControl.IsGrouping" Value="True">
                                    <Setter Property="ScrollViewer.CanContentScroll" Value="False">
                                    </Setter>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
     
            </Style>
    Et désormais je récupère facilement mon Grid en code behind grâce à la méthode GetTemplateChild.

  5. #5
    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
    Beau travail

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

Discussions similaires

  1. [Débutant] System.Data.Objects.DataClasses.EntityObject' est défini dans un assembly qui n'est pas référencé.
    Par Alexandre le Grand dans le forum Entity Framework
    Réponses: 1
    Dernier message: 17/02/2014, 13h56
  2. Réponses: 3
    Dernier message: 14/02/2013, 18h04
  3. Réponses: 2
    Dernier message: 07/01/2011, 15h27
  4. Réponses: 1
    Dernier message: 26/01/2010, 14h40

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