Menu

WPF Superposition de CANVAS [Résolu]

Messages postés
42
Date d'inscription
jeudi 7 février 2019
Dernière intervention
22 mars 2019
- - Dernière réponse : Whismeril
Messages postés
12947
Date d'inscription
mardi 11 mars 2003
Dernière intervention
25 mars 2019
- 6 mars 2019 à 16:08
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
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
Messages postés
12947
Date d'inscription
mardi 11 mars 2003
Dernière intervention
25 mars 2019
499
1
Merci
Bonsoir,

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

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 46740 internautes nous ont dit merci ce mois-ci

robunccm
Messages postés
42
Date d'inscription
jeudi 7 février 2019
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?
Commenter la réponse de Whismeril
Messages postés
12947
Date d'inscription
mardi 11 mars 2003
Dernière intervention
25 mars 2019
499
1
Merci
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.

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 46740 internautes nous ont dit merci ce mois-ci

robunccm
Messages postés
42
Date d'inscription
jeudi 7 février 2019
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
Commenter la réponse de Whismeril
Messages postés
12947
Date d'inscription
mardi 11 mars 2003
Dernière intervention
25 mars 2019
499
1
Merci
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.

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 46740 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Whismeril
Messages postés
12947
Date d'inscription
mardi 11 mars 2003
Dernière intervention
25 mars 2019
499
0
Merci
Peut être peux tu faire un tour sur mon tuto concernant l’objet en .net.
J’ai essayé de l’expliquer clairement
Commenter la réponse de Whismeril
Messages postés
12947
Date d'inscription
mardi 11 mars 2003
Dernière intervention
25 mars 2019
499
0
Merci
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
Commenter la réponse de Whismeril
Messages postés
42
Date d'inscription
jeudi 7 février 2019
Dernière intervention
22 mars 2019
0
Merci
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
Commenter la réponse de robunccm
Messages postés
42
Date d'inscription
jeudi 7 février 2019
Dernière intervention
22 mars 2019
0
Merci
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 ....
Commenter la réponse de robunccm
Messages postés
12947
Date d'inscription
mardi 11 mars 2003
Dernière intervention
25 mars 2019
499
0
Merci
De rien et bonne continuation
Commenter la réponse de Whismeril