Les classes Geometry
de WPF ont toutes les primitives dont vous avez besoin pour accomplir cela facilement, mais vous devrez le faire en code. Quand j'ai besoin de faire des lignes personnalisées, je construis généralement un Drawing
basé sur le Geometry
, mais dans votre cas, vous pouvez simplement construire un Geometry
qui a trois lignes en parallèle et le contourner.
- Démarrer avec
PathGeometry.CreateFromGeometry()
pour obtenir un PathGeometry
pour le chemin d'entrée
- utilisation
GetWidenedPathGeometry()
, en passant dans l'espacement souhaité, pour obtenir une nouvelle géométrie dont les bords correspondent aux lignes latérales
- (optionnel) Retirer les segments à la fin de la géométrie élargie, si désiré
- Combiner la ligne latérale geomerty avec la géométrie d'origine en utilisant un
CombinedGeometry
- Stroke la géométrie combinée pour obtenir une ligne triple
Plus d'explications sur l'étape 3: La géométrie élargie comporte des segments de ligne à la fin de la ligne d'origine. Cela provoque une ligne à tirer à la fin de votre ligne, ce qui en fait esthétique dans de nombreuses situations. Si votre situation semble meilleure sans elle, supprimez-la en itérant la géométrie de la ligne latérale et en supprimant tous les segments de ligne qui traversent les points d'extrémité du chemin d'origine. Ce qui précède prend environ 8 lignes de code si vous ne supprimez pas les extrémités, ou 15 si vous le faites.
Une astuce pour rendre cela pratique est de créer une propriété attachée qui contraint effectivement la propriété Data
du contrôle Path
auquel elle est attachée. Avec une telle propriété attachée, tout ce que vous devez écrire est:
<Path TripleStroke.Enable="true" Data="..." />
Si vous savez comment implémenter des propriétés attachées et enregistrent des gestionnaires en eux, c'est un morceau de gâteau. Si ce n'est pas le cas, prévoyez de passer plusieurs heures à apprendre à coder les propriétés attachées pour simuler la coercition de valeur avant de mettre en œuvre l'approche de propriété jointe.
Mise à jour
La technique de base ci-dessus je décris peut également être étendue pour permettre un modèle arbitraire à appliquer le long d'un chemin. Pour un exemple, consultez les pinceaux personnalisés dans l'outil de conception d'expression. Cependant, il n'y a rien de prévu dans WPF pour faire cela pour vous, vous devrez donc le créer vous-même, et je peux vous dire par expérience que c'est beaucoup de travail.Voici les étapes de base:
d'abord créer une méthode qui prend un Geometry
un Drawing
existant et certains paramètres pour embouts, etc et crée une nouvelle Drawing
qui répète la donnée Drawing
le long du chemin donné par le Geometry
. Ensuite, il est facile de dessiner un tracé strié: Créez un Drawing
pour décrire le trait personnalisé, puis affichez le trait en utilisant un DrawingVisual
qui contient un Binding
avec un convertisseur qui appelle votre méthode de conversion.
Pour mettre en œuvre effectivement la méthode de conversion:
- Convertir la source dessin dans un ensemble de
GeometryDrawing
objets (J'ai également soutenu ImageDrawing
mais qui est plus compliqué, car vous devez utiliser le système 3D pour étirer les images) . Cela est fait en récursif à travers DrawingGroup
objets, en gardant la trace des transformations que vous allez, et la construction de GeometryDrawings avec la transformation appropriée.
- Supprimez des parties de la géométrie dans les zones "embout" du dessin d'origine et mettez-les de côté.
- Effectuez une itération le long du chemin en dupliquant les objets
GeometryDrawing
à plusieurs reprises avec les transformations de coordonnées appropriées appliquées à toutes les coordonnées de la géométrie.
- Traiter les sections "embout" de la géométrie en utilisant la même procédure.
A noter également que dans l'étape 1 GlyphRunDrawings
quelconque sont traitées en utilisant FormattedText.BuildGeometry
pour créer un GeometryDrawing
équivalent.
Je n'ai pas assez de temps pour rechercher une réponse appropriée pour vous en ce moment, mais jetez un oeil à cet article: http://msdn.microsoft.com/en-us/magazine/cc337899.aspx, il pourrait vous est très utile, et il y a une implémentation d'un chemin de ligne parallèle inclus, je crois. – Egor
Salut thx pour le commentaire, mais j'ai déjà parcouru le ci-dessus sa copie du chemin existant, pas un seul chemin avec un pinceau différent – Chandimal
pourrait utiliser http://blogs.msdn.com/b/mrochon/archive/2011/01 /10/custom-line-caps-in-wpf.aspx puis tracez une ligne plus longue en tant que lignes consécutives plus petites de longueur 1 ou quelque chose avec les edgecaps personnalisés que vous voulez –