WPF Superposition de CANVAS [Résolu/Fermé]

Signaler
Messages postés
42
Date d'inscription
jeudi 7 février 2019
Statut
Membre
Dernière intervention
22 mars 2019
-
Messages postés
14462
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 juillet 2020
-
Bonjour,
Je cherche à réaliser une vue de réseau ferré composée de différents objets AiguillageDroite AiguillageGauche VoiesDroite VoiesCourbes FeuxSignalisation ...... pour l'instant j'ai créé deux Class pour AIguillagesDroite et AiguillageGauche (à ne pas confondre avec la position des aiguilles Directes ou Déviées)

tous ces éléments sont décrits dans un fichier XML (posX, posY, angle ....)

Pour mes tests j'ai deux ListBox avec chacun un Canvas pour afficher et positionner mes éléments comme ceci et je peux actionner chacun des contrôles qui alors modifie son apparence graphique et met à jour le TextBox en haut à gauche


Si je superpose mes deux Canvas, nécessité pour construire ma vue de reseau, je parvient à le faire visuellement mais les Cliks sur les Contrôles du Canvas inférieur ne sont pas détectés


c'était ma crainte je ne suis pas réellement surpris mais peut-être y a-t-il un moyen?

j'ai essayé avec un CANVAS intégrant les deux ListBox dans ce cas je perd le bénéfice du positionnement
programmé et mes Contôles sont affichés comme dans ListBox



Existe-t-il une façon d'intéger dans le XAML une collection d'objets dans un Canvas sans subir de mise forme comme l'impose un ListBox ?

Merci de vos réponses et suggestions
Amicalement Roland


Configuration: Windows / Chrome 72.0.3626.109

8 réponses

Messages postés
14462
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 juillet 2020
553
Bonsoir,

Je ne comprends pas la nécessité de superposer les Canvas.
Ne peux tu pas afficher tous les auguillages dans un seul Canvas?
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 64659 internautes nous ont dit merci ce mois-ci

Messages postés
42
Date d'inscription
jeudi 7 février 2019
Statut
Membre
Dernière intervention
22 mars 2019

Bonsoir Whismeril
Ne peux tu pas afficher tous les auguillages dans un seul Canvas?

je ne crois pas car j'ai deux Class d'aiguillage Gauche et Droite que je pourrais sans doute confondre en une seule mais j'ai d'autres éléments comme les courbes, les droites, les feux, les cantons à représenter
je pensais pouvoir superposer plusieurs Canvas (1 par Class d'objets)

Mon besoin est de poser tous ces éléments dans un Canvas pour symboliser le réseau et commander différents organes en cliquant dessus comme ce petit exemple


En l'état de mes connaissances j'ai utilisé ListBox pour servir le XAML car je ne sais pas s'il y a une autre manière de décliner une collection pour l'afficher

ou bien dois-je concevoir une Class globale pour tout type d'éléments à afficher et n'avoir qu'un seul LIstBox dans ce cas?
Messages postés
14462
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 juillet 2020
553
Vu que tu veux poser tes éléments comme sur une carte la listbox ne me parrait pas adapté.
Le Canvas l'est plus dans le sens où il permet un positionnement.
Comme c'est un contrôle que j'ai peu utilisé et pas depuis longtemps, là comme ça faut que je me plonge dedans pour binder une collection.
Au pire tu peux placer ta (tes) collection(s) dans le code behind.

j'ai deux Class d'aiguillage Gauche et Droite que je pourrais sans doute confondre en une seule
en supposant que les différences entre les 2 justifient 2 classes, il y a (je pense) quand même une majorité de code en commun.
Dans ce cas, il faut (là c'est plus qu'un conseil) écrire 3 classes, une classe "Aiguillage" qui contient tout le code en commun, et 2 classes qui en dérivent contenant les codes spécifiques.
Avantages:
  • le code commun est écrit une seule fois, maintenu une seule fois
  • tu peux faire une collection d'aiguillages qui contient des droites et des gauches (polymorphisme)


Et juste pour pouvoir faire une collection de tous tes éléments de rail, tu devrais écrire une classe dont ils dérivent tous, même s'il y a très peu (voir pas ) de code en commun (je vois au moins une image).

Le polymorphisme est un mécanisme fondateur de la programmation objet.

Précédemment quand dans le click d'un bouton, on castait sender (de type object Microsoft ne s'embête même pas...) en Buton, c'est grâce au polymorphisme. Tout dérive d'object, donc forcément un Buton est un object et peu passer par la variable sender, mais quand on a besoin d'un truc qui vient de Control, ou de Buton, on caste sender dans l'un ou l'autre type est on y accède.
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 64659 internautes nous ont dit merci ce mois-ci

Messages postés
42
Date d'inscription
jeudi 7 février 2019
Statut
Membre
Dernière intervention
22 mars 2019

Je ne savait pas que sur CCM on bénéficiait de cours particulier c'est super merci beaucoup

Tout à fait d'accord sur l'inadéquation du ListBox mais je n'ai pas encore d'autre solution pour énumérer ma collection d'aiguillage dans le XAML je cherche ...

Le polymorphisme encore un gros mot qu'il va me falloir mettre dans mon vocabulaire.
Comme tu l'exprimes je comprends bien l’intérêt, j'avais bien pensé à combiner ces deux classes mais je prenais le problème à l'envers.
En fait je dois pouvoir même créer une classe Composant et dériver chaque variante, déjà citée précédemment, car ils auront tous en commun de nombreux attributs tels que numéro, posX, posY, angle, image, ......

j'aimerais même binder
<code c>MouseLeftButtonDown="{Binding ClickAiguillage}"<code>
mais je ne crois pas cela possible

Merci de tes conseils j'attaque mes Classes et te tiens au courant
Messages postés
14462
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 juillet 2020
553
Bonjour

car il va me falloir attaquer le gestionnaire d'itinéraires
alors ça, cela peut s'avérer très complexe.
Il va te falloir travailler la théorie des graphes (je ne maitrise pas du tout), ici http://www.laas.fr/files/MOGISA/PresentationMathese.pdf page 11, il cite les algorithmes que tu pourras utiliser.
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 64659 internautes nous ont dit merci ce mois-ci

Messages postés
14462
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 juillet 2020
553
Peut être peux tu faire un tour sur mon tuto concernant l’objet en .net.
J’ai essayé de l’expliquer clairement
Messages postés
14462
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 juillet 2020
553
Bonsoir

je n'ai pas trop eu de temps pour me pencher sur le binding dans un Canvas.

Mais à priori, il y a moyen d'utiliser un itemControl en lui disant de se comporter comme un Canvas.
https://stackoverflow.com/questions/2317713/binding-wpf-canvas-children-to-an-observablecollection
Messages postés
42
Date d'inscription
jeudi 7 février 2019
Statut
Membre
Dernière intervention
22 mars 2019

Bonjour
merci du tuyau je vais gratter
pour le moment je suis resté avec un ListBox car en j'ai pu unifier mes symboles et n'avoir qu'une seule classe et cela fonctionne bien

sur ma vue réseau je dispose d'un mode commande et d'un mode édition
en édition le click sur un symbole ouvre une petite fenêtre qui me permet le positionnement, l'ajout, la suppression ...de l'objet correspondant
j'essaierai le drag & drop plus tard
en mode commande le click sur un symbole aiguillage élabore une commande qui est confiée à l'objet Arduino qui l'envoi sur Ethernet, on voit sur l'écran la commande et son retour


je vais maintenant créer et positionner les feux de signalisation

tu vois mon projet avance et mes questions se font moins pressantes mais cela ne saurai tarder car il va me falloir attaquer le gestionnaire d'itinéraires je t'en parlerai
A+ Roland
Messages postés
42
Date d'inscription
jeudi 7 février 2019
Statut
Membre
Dernière intervention
22 mars 2019

Bonjour à tous et comme d'habitude bonjour à Whismeril

bien que marqué résolu le reste sur ce fil qui ce complète

J'ai mis en oeuvre ItemsControl
 <ItemsControl Name="icTodoList" DataContext="{Binding .}" ItemsSource="{Binding Crs}" >

c'est exactement ce que je cherchais

j'ai trouvé un superbe exemple de panoramique et zoom
je vais pouvoir tracé mon réseau dans une seule fenêtre et m'y déplacer à mon gré
je prévoirai tout de même des boutons pour des accès rapides à des vues standards




je suis impressionné par les possibilités de WPF, certes il n'est pas évident d'y plonger, mais quant on voit le résultat avec si peu de code çà ouvre l'appétit, merci encore à Whismeril de m'avoir permit de vaincre les mes difficultés de débutant, que je suis encore ....
Messages postés
14462
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 juillet 2020
553
De rien et bonne continuation