J'ai récemment développé un composant de dessin pour mon entreprise, avec un canevas sur lequel vous pouvez dessiner certaines formes en cliquant-glissant. Pour chaque forme, j'ai placé deux ornements sur son AdornerLayer: Un pour la détection de coup accru (essentiellement un rectangle transparent qui dépasserait les limites de la forme de quelques pixels), et un autre pour le redimensionnement (quatre contrôles Thumb sur les coins). Mais, j'ai rencontré de nombreux problèmes lors de l'implémentation de certaines des fonctionnalités du composant, toutes liées à l'adorer.À quoi servent les ornements WPF?
Ils ont capturé tous les événements aperçu, car ils se trouvaient dans un autre arbre visuel que la toile elle-même, qui était inattendu, mais je trouve une solution, même si je ne l'aimais pas beaucoup. Utilisation d'un AdornerDecorator n'a pas résolu ce problème, un adorateur de sélection que j'ai mis en œuvre est un trou noir pour les événements de prévisualisation. Lorsque j'ai implémenté la manipulation des formes sur le canevas par l'index z (envoi vers l'arrière, mise en avant, etc.), cela a bien fonctionné avec Panel.SetZIndex, comme vous pouvez vous y attendre. Mais, les ornements sont dans un autre arbre visuel! donc ils n'étaient pas affectés et les ornements de sélection étaient TOUJOURS au-dessus de toutes les autres formes, même si ces formes étaient au-dessus de celle pour laquelle l'amateur de sélection détectait des hits. Par exemple: Shape1, SelectionAdorner1. Shape2, SelectionAdorner2. Shape1 est sur le dessus (ajouté plus tard à la toile) de Shape2, donc il se chevauche. Donc un clic dessus sera détecté par SelectionAdorner1. J'ai manipulé le ZIndex pour l'envoyer en arrière, maintenant Shape2 est sur le dessus et chevauche Shape1. Je clique en haut de Shape2, mais le clic est détecté par SelectionAdorner1 au lieu de SelectionAdorner2. C'était particulièrement agaçant. Donc, apparemment depuis que les Adorners sont sur un autre arbre visuel, ils ne respectent pas ZIndexes. J'ai essayé de le résoudre en créant un DataBinding (et aussi en réglant manuellement) entre le ZIndex de la forme et le ZIndex de son SelectionAdorner. Mais cela n'a pas résolu le problème. Changer le ZIndex d'Adorners n'affectait pas la façon dont ils étaient affichés à l'écran, peut-être qu'il me manquait quelque chose, mais ça ne devrait pas être si difficile, puisque les Adorners sont censés être faits pour faciliter les choses. La seule solution que je pouvais trouver était de supprimer manuellement tous les ornements et de les rajouter manuellement un par un, en ajoutant pour finir celui qui était censé être en haut. C'était retardé, mais ça a marché.
Ensuite, les Adorners ne respectent pas ClipToBounds! J'ai mis ClipToBounds = true dans le Canevas sur lequel je dessinais, et ça a bien fonctionné, mais les putains d'ornements continueraient à fonctionner! La solution à ce problème était relativement indolore, j'ai juste ajouté un AdornerDecorator sur chaque forme. Pas une solution idéale IMO, mais celle qui était assez simple.
Les ornements ne réagissent pas toujours bien aux LayoutTransforms effectués sur leurs éléments ornés. J'ai un panneau sur le dessus de la toile qui implémente la fonctionnalité de Zoom et Pan. Il a utilisé des animations pour faire un zoom avant et arrière plus lisse. Mais en utilisant des animations, mes Adorners sont devenus des singes! Le premier zoom, ils ignoreraient simplement le redimensionnement et resteraient de la même taille et la position, sur le deuxième zoom, ils seraient à l'échelle de la précédente taille de l'élément orné. Cela n'a aucun sens! seule solution que je pouvais trouver était de désactiver les animations, qui, heureusement, a travaillé
Je ne me souviens pas tout à fait que d'autres questions que j'avais, mais cela était plus que suffisant pour me mame interroger sur l'utilité de Adorners, et je J'envisage sérieusement de ne pas les utiliser dans mon prochain projet, qui est similaire à celui que j'ai décrit. Donc, quelqu'un peut-il me dire ce qui pourrait être les avantages de l'utilisation de ces choses apparemment utiles mais incroyablement ennuyeux?
Merci.
Vous avez très raison, vos exemples d'où ils pourraient être utiles m'intéressent, et particulièrement puisque j'aurais besoin de quelque chose comme ça pour le glisser-déposer, merci pour le conseil. –