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 :

Accéder au template d'un controle par le code


Sujet :

Windows Presentation Foundation

  1. #1
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut Accéder au template d'un controle par le code
    Bonjour,

    Je cherche a accéder au propriété du controle Image se trouvant dans le template de mon bouton pour y modifier sa hauteur et largeur à partir du code.


    Quelqu'un peut il m'indiquer comment faire?

    voici le code xaml:
    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
     
            <Button Visibility="Hidden" Click="btnDroite_Click"  x:Name="btnDroite"  Height="25" Margin="0,33.75,0,0" VerticalAlignment="Top" Opacity="0" HorizontalAlignment="Right" Width="25">
                <Button.Template>
                    <ControlTemplate TargetType="{x:Type Button}" >
                        <Image x:Name="Img1" Height="25" Width="25" 
                     Source="/Images/jaunedroite.png" />
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter TargetName="Img1" Property="Source" Value="/Images/bleudroite.png" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Button.Template>
     
            </Button>

    merci

  2. #2
    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,

    La classe VisualTreeHelper te le permet. Le lien suivant décrit comment récupérer un élément généré par DataTemplate :
    http://msdn.microsoft.com/fr-fr/library/bb613579.aspx

  3. #3
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    Bonsoir,

    Le code ne fonctionne, il semblerait que la raison soit que j'utilise un itemsource car dans mon foreach il me dit qu'il ne peut pas caster l'object "CBackground" en listboxitem.

    Donc comment est ce que je peux faire dans mon cas?
    je ne vois pas

    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
                // Getting the currently selected ListBoxItem
                // Note that the ListBox must have
                // IsSynchronizedWithCurrentItem set to True for this to work
                foreach (ListBoxItem item in listBoxFond.Items)
                {
                    ListBoxItem myListBoxItem =
                        (ListBoxItem)(listBoxFond.ItemContainerGenerator.ContainerFromItem(item));
    
                    // Getting the ContentPresenter of myListBoxItem
                    ContentPresenter myContentPresenter = FindVisualChild<ContentPresenter>(listBoxFond);
    
                    // Finding textBlock from the DataTemplate that is set on that ContentPresenter
                    DataTemplate myDataTemplate = myContentPresenter.ContentTemplate;
                    System.Windows.Controls.Image myImage = (System.Windows.Controls.Image)myDataTemplate.FindName("listimg", myContentPresenter);
    
                    myImage.Height = _height;
                    myImage.Width = _width;
                }


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    listBoxFond.ItemsSource = Window1.ListOfBackgrounds;


    dites moi si je n'ai pas été assez clair

  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 214
    Points : 341
    Points
    341
    Par défaut
    Quand tu "lies" un ListBox avec une source de donnée (ici ton objet ListOfBackgrounds), la propriété Items de ton ListBox contient directement tes objects (contenu dans ListOfBackgrounds).

    En interne, le composant ListBox génére des ListBoxItem pour "englober" tes objets. Tu ne peux donc pas écrire directement le dernier code que tu as mis, tu peux en revanche utiliser l'exemple suivant qui doit fonctionner:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach(objetdelalisteofbackground item in listboxFonds.Items)
    {
    ListViewItem lvi = (ListViewItem)listboxFonds.ItemContainerGenerator.ContainerFromItem(item);
    }

  5. #5
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach(objetdelalisteofbackground item in listboxFonds.Items)
    {
    ListViewItem lvi = (ListViewItem)listboxFonds.ItemContainerGenerator.ContainerFromItem(item);
    }
    Il me semble avoir déja essayé, j'ai une erreur de castage: "impossible de caster monobjet en listviewitem".

  6. #6
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 214
    Points : 341
    Points
    341
    Par défaut
    Je viens de tester sur mon projet actuel et ça fonctionne bien.

    Tu peux nous mettre ton exemple de code qui marche pas ?

  7. #7
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    Citation Envoyé par Jérem22 Voir le message
    Je viens de tester sur mon projet actuel et ça fonctionne bien.

    Tu peux nous mettre ton exemple de code qui marche pas ?
    Je suis actuellement au bureau, je testerai donc ce soir, mais il me semblait avoir testé ce que tu as fait, j'espere me tromper

  8. #8
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    quand je fais ceci le castage marche sauf que ma variable 'lvi' est null donc forcement aprés j'ai une érreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ListViewItem lvi = (ListViewItem)listboxFonds.ItemContainerGenerator.ContainerFromItem(item);

  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 vais faire une supposition , peut-être que tu remplis ta listbox avec la propriété ItemsSource. Si c'est le cas, récupère plutôt cette propriété qui ne devrait pas être nulle. Tu devras ensuite la caster correctement.

    En espérant que ce soit ça

  10. #10
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    Citation Envoyé par binoo Voir le message
    Salut,

    Je vais faire une supposition , peut-être que tu remplis ta listbox avec la propriété ItemsSource. Si c'est le cas, récupère plutôt cette propriété qui ne devrait pas être nulle. Tu devras ensuite la caster correctement.

    En espérant que ce soit ça
    tu te trompes, ma variable 'item' elle n'est pas nulle, c'est la variable 'myListBoxItem' qui l'est.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    foreach (CBackground item in listBoxFond.ItemsSource)
                {
                    ListBoxItem myListBoxItem =
                        (ListBoxItem)(listBoxFond.ItemContainerGenerator.ContainerFromItem(item));
    ...
    }

  11. #11
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 214
    Points : 341
    Points
    341
    Par défaut
    Tu exécutes cette boucle à quel moment dans ton appli ?
    Es-tu certain qu'a ce moment le ListBox a bien fini son initialisation ?

  12. #12
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    J'ai réussi à trouver mon erreur


    par contre je me trouve dans un cas assez similaire sauf que cette fois le veux accéder au Template Image d'un Bouton.



    J'ai donc tenter ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                    ContentPresenter myContentPresenter = FindVisualChild<ContentPresenter>(btnDroite);
     
                    // Finding textBlock from the DataTemplate that is set on that ContentPresenter
                    DataTemplate myDataTemplate = myContentPresenter.ContentTemplate;
                    System.Windows.Controls.Image myImage = (System.Windows.Controls.Image)myDataTemplate.FindName("Img1", myContentPresenter);
     
                    myImage.Height = _height;
                    myImage.Width = _width;

    code xaml:
    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
     
            <Button Visibility="Hidden" Click="btnDroite_Click"  x:Name="btnDroite"  Height="25" Margin="0,33.75,0,0" VerticalAlignment="Top" Opacity="0" HorizontalAlignment="Right" Width="25">
                <Button.Template>
                    <ControlTemplate TargetType="{x:Type Button}" >
                        <Image x:Name="Img1" Height="25" Width="25" 
                     Source="/Images/jaunedroite.png" />
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter TargetName="Img1" Property="Source" Value="/Images/bleudroite.png" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Button.Template>
     
            </Button>





    [EDIT]

    je pense avoir trouver ma réponse ici

    [/EDIT]

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 10/09/2014, 10h19
  2. Supprimer un control par le code.
    Par Gualino dans le forum VB.NET
    Réponses: 8
    Dernier message: 02/11/2011, 16h15
  3. Accèder à un controle par autre chose que son nom
    Par Kemanke dans le forum VC++ .NET
    Réponses: 4
    Dernier message: 07/11/2008, 11h24
  4. Delphi7-DOA accéder au champ d'un enregistrement par indice
    Par delphim dans le forum Bases de données
    Réponses: 1
    Dernier message: 04/05/2005, 14h42
  5. [MF] : Afficher control par dessus image
    Par DarkWiken dans le forum MFC
    Réponses: 2
    Dernier message: 01/04/2005, 22h06

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