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 :

[WPF] Récupérer sender personnalisé


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif

    Homme Profil pro
    Software Developer
    Inscrit en
    Mars 2008
    Messages
    1 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Software Developer

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 470
    Par défaut [WPF] Récupérer sender personnalisé
    Bonjour,

    J'ai réaliser un programme qui affiche des éléments graphiques (Geometry) dans une fenêtre.
    Les éléments graphiques sont intégrés à mes classes de dessin et ces classes doivent être sérialisées.

    Le problème que je rencontre c'est que dans ma vue, lorsque je clique sur un de mes éléments graphiques je récupère dans l'évènement MouseLeftButtonDown seulement l'objet Path, il est m'est donc impossible de manipuler directement toutes mes propriétés de la classe associée à l'objet.

    J'ai donc ensuite essayé en créant une classe héritant de Shape, là en cliquant sur mon dessin j’arrivais à récupérer l'instance de ma classe, mais le problème c'est que la sérialisation ne fonctionne plus (Shape n'est pas sérialisable).

    Ma classe contenant des propriétés et réalisant le dessin :
    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
     
    public class MyGraphicObject
    {
        private Path shape;
        private GeometryGroup geometry;
        private EllipseGeometry ellipse;
     
        private double x;
        private double y;
        private int size;
        [XmlAttribute()] public double X { get; set; }
        [XmlAttribute()] public double Y { get; set; }
        [XmlAttribute()] public double Size { get; set; }
     
        public MyGraphicObject()
        {
            InitView(0, 0);
        }
        public MyGraphicObject(double x, double y)
        {
            InitView(x, y);
        }
     
        private void InitView(double x, double y)
        {
            // Var
            this.X = x;
            this.Y = y;
            this.Size = 8;
     
            // Création de la vue associée
            ellipse = new EllipseGeometry(new Point(this.X, this.Y), this.Size, this.Size);
            geometry = new GeometryGroup();
            geometry.Children.Add(ellipse);
     
            this.shape = new Path()
            {
                Stroke = Brushes.Black,
                StrokeThickness = 1,
                Fill = Brushes.Transparent,
                Data = geometry
            };
     
            Layers.LayerSelected.AddChildren(this.shape);
        }
    }
    Si quelqu'un a une idée je suis preneur.

    Merci.

  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 : 44
    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
    Par défaut
    Tu peux affecter ton objet à la propriété Tag des objets visuels (voire au DataContext, si ça a un sens dans ton appli). Ensuite il suffit de caster cette propriété vers le type voulu pour récupérer l'objet dans l'évènement

  3. #3
    Membre extrêmement actif

    Homme Profil pro
    Software Developer
    Inscrit en
    Mars 2008
    Messages
    1 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Software Developer

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 470
    Par défaut
    Merci tomlev,

    En effet ça fonctionne, mais n'y a t'il pas d'autres solutions ?
    Pour moi utiliser les Tag c'est plus pour pallier à des lacunes d'adaptation de notre code.

    PS : Merci infiniment pour ton super tuto sur la sérialisation, excellent boulot.

  4. #4
    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 : 44
    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
    Par défaut
    Citation Envoyé par alex_vino Voir le message
    En effet ça fonctionne, mais n'y a t'il pas d'autres solutions ?
    Pour moi utiliser les Tag c'est plus pour pallier à des lacunes d'adaptation de notre code.
    Non, c'est fait pour ça... regarde ce que dit la doc :

    Obtient ou définit une valeur d'objet arbitraire qui peut être utilisée pour stocker des informations personnalisées à propos de cet élément.
    Ca correspond tout à fait à ton cas d'utilisation...

  5. #5
    Membre extrêmement actif

    Homme Profil pro
    Software Developer
    Inscrit en
    Mars 2008
    Messages
    1 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Software Developer

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 470
    Par défaut
    Exact, merci.

    Sinon comme tu es le pro de la sérialisation tu va surement pouvoir m'aider :

    j'ai une classe enfant qui est partagée par 2 classes.
    Lors de la sérialisation cette classe enfant sera sauvegardée entièrement dans les des classes parents et donc lors de la désérialisation l'objet enfant sera créé en double, et ainsi la modification d'un de ces doublons ne modifiera plus l'autre.

    As-tu une idée de comment on pourrait faire ?

  6. #6
    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 : 44
    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
    Par défaut
    Citation Envoyé par alex_vino Voir le message
    j'ai une classe enfant qui est partagée par 2 classes.
    Lors de la sérialisation cette classe enfant sera sauvegardée entièrement dans les des classes parents et donc lors de la désérialisation l'objet enfant sera créé en double, et ainsi la modification d'un de ces doublons ne modifiera plus l'autre.

    As-tu une idée de comment on pourrait faire ?
    Euh, là je vois pas trop non... La sérialisation XML ne sait pas gérer les références multiples aux mêmes objets. Par si tu n'as pas trop de contraintes sur le schéma du XML généré tu pourrais utiliser le DataContractSerializer, qui sait gérer ce genre de choses

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

Discussions similaires

  1. [WPF] Récupérer valeur Listview
    Par jeremieca dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 16/12/2009, 21h15
  2. Réponses: 3
    Dernier message: 05/02/2008, 16h19
  3. Réponses: 11
    Dernier message: 10/12/2007, 14h47
  4. Réponses: 6
    Dernier message: 28/09/2007, 17h33
  5. Comment récupérer le nom d'un composant à partir d'un sender?
    Par PDelph7 dans le forum Composants VCL
    Réponses: 6
    Dernier message: 03/09/2007, 19h35

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