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 :

Arrangement d'objets dans un Canvas


Sujet :

Windows Presentation Foundation

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Points : 11
    Points
    11
    Par défaut Arrangement d'objets dans un Canvas
    Salut a tous !

    Mon probleme :
    J'ai plusieurs objets qui sont des control qui sont places aleatoirement dans un Canvas et il arrive parfois qu'ils se chevauchent.
    J'aimerais programmer une methode qui fasse en sorte de detecter une "collision" entre deux de ces objets et qui me permettra donc de les positionner.
    On m'a parle du HitTest mais apres avoir passe des heures sur msdn, je n'ai rien compris au fonctionnement ou du moins je n'ai pas reussi a l'appliquer a mon code... On m'a egalement parle de la methode "Arrange" mais je ne pense pas qu'elle soit applicable a mon probleme.
    Qu'en pensez-vous ?

    Thanks !

  2. #2
    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
    Tu veux récréer un moteur physique ?

  3. #3
    Membre éprouvé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Points : 1 060
    Points
    1 060
    Par défaut
    Bonsoir,

    Je me trompe peut être me je pense qu'il te manque juste le mot clef : "Layout"...

    Ca m'étonne que tu souhaites développez toi même une politique de placement et je suis persuadé que tu as déjà des composants qui s'en charge...

    Bon courage

    ps :
    Pour ma part, je ne recherche jamais dans le site mal fichu de msdn un truc précis...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Points : 11
    Points
    11
    Par défaut
    Non, evidemment si je trouve une methode qui le fait automatiquement, c'est super ! Mais apres plusieurs recherches, je n'ai rien trouve de tel. Une idee ?

  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

  6. #6
    Membre éprouvé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Points : 1 060
    Points
    1 060
    Par défaut
    Citation Envoyé par SimonAFDT Voir le message
    Non, evidemment si je trouve une methode qui le fait automatiquement, c'est super ! Mais apres plusieurs recherches, je n'ai rien trouve de tel. Une idee ?
    http://mdordolo.developpez.com/tutoriels/wpf/layoutwpf/


    C'est ça que tu ne connais pas non? Du coup tu utilises un Canvas alors qu'il te faudrait un élément présenté dans le lien?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Points : 11
    Points
    11
    Par défaut
    Merci pour ta reponse !

    Malheureusement, j'ai essaye d'appliquer le TransformToVisual et IntersectsWith a mon code mais il me retourne toujours le meme nombre de collisions, a savoir le nombre d'elements de mon Canvas

    Je vous montre le code :
    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
     
    public Rect GetBounds(UserControl of, Canvas from)
            {
                GeneralTransform transform = of.TransformToVisual(from);
                return transform.TransformBounds(new Rect(0, 0, of.Width, of.Height));
            }
     
    public void Arrange()
            {
                foreach (object obj in this.canvasTest.Children)
                {
                    UserControl1 control = obj as UserControl1;
                    if (control != null)
                    {
                        var currentBounds = GetBounds(control, canvasTest);
                        int c = 0;
     
                        foreach (object obj1 in this.canvasTest.Children)
                        {
                            UserControl1 control1 = obj1 as UserControl1;
                            if (GetBounds(control1, canvasTest).IntersectsWith(currentBounds))
                            {
                                c++;
                            }
                        }
                        Console.WriteLine("Number of hits "+ c);
                    }
                }
            }
    J'ai 3 UserControl dans mon Canvas donc deux qui se chevauchent mais il me retourne c=3 pour chacun des UserControl

    Une idee peut etre ?
    Merci d'avance

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Points : 11
    Points
    11
    Par défaut
    Bretus, malheureusement, je suis oblige d'utiliser un Canvas parce que je veux pouvoir inserer les Control n'importe ou sur la page... Ils sont inseres dans le Canvas par rapport a un Point.

  9. #9
    Membre éprouvé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Points : 1 060
    Points
    1 060
    Par défaut
    Citation Envoyé par SimonAFDT Voir le message
    Bretus, malheureusement, je suis oblige d'utiliser un Canvas parce que je veux pouvoir inserer les Control n'importe ou sur la page... Ils sont inseres dans le Canvas par rapport a un Point.
    Ok, continue sur l'autre piste alors.

    Bon courage

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Points : 11
    Points
    11
    Par défaut
    Apres quelques modificaions, j'ai teste cette solution dans un projet a part, et il se trouve qu'elle marche !

    Cependant elle ne marche pas dans mon projet
    Le probleme vient de la fonction TransformToVisual dans GetBounds qui me retourne une exception "NuulReferenceException" (comme le dit le commentaire) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            public Rect GetBounds(UserControl contained, Canvas container)
            {
                // Might throw an exception if contained and container are not in the same visual tree
                GeneralTransform transform = contained.TransformToVisual(container);
     
                return transform.TransformBounds(new Rect(Canvas.GetLeft(contained), Canvas.GetBottom(contained), contained.ActualWidth, contained.ActualHeight));
            }
    Any ideas ?
    Merci

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Points : 11
    Points
    11
    Par défaut
    Le probleme venait tout simplement du fait que je suis un âne.
    Donc cette methode marche bien pour detecter les collisions !

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 31
    Points : 11
    Points
    11
    Par défaut
    Pour ceux que ca interesse, je vous montre comment j'ai fait.

    En fait, la methode TransformToVisual ne servait a rien pour mon cas, j'ai tout simplement cree un rectangle autour de mes control de la facon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new Rect(Canvas.GetLeft(control), Canvas.GetTop(control), control.ActualWidth, control.ActualHeight);
    Et ensuite je teste la collision avec les autres objets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (Rect1.IntersectsWith(Rect2))
                                    {
                                        ...;
                                    }
    Voilou

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

Discussions similaires

  1. Plusieurs fois le même objet dans un Canvas
    Par Invité dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 27/06/2011, 16h46
  2. Réponses: 4
    Dernier message: 21/01/2010, 15h17
  3. Etirer un objet dans un canvas
    Par Ggamer dans le forum wxPython
    Réponses: 3
    Dernier message: 14/10/2007, 13h02
  4. Insérer un objet dans un canvas : possible ?
    Par gedeon555 dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 04/06/2006, 14h42

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