2009-10-29 13 views
4

Dans WPF, existe-t-il un moyen de modifier la façon dont un chemin est tracé APART à partir de séquences Dash-Dot? Dire que je veux dessiner une ligne triple pour n'importe quel chemin que je dessine ou de petits triangles, vagues ... etc sur le chemin de dessin lui-même. J'ai essayé des pinceaux mais il ne suivra pas le Path. S'il vous plaît aiderLigne WPF, chemin d'accès ..etc style de dessin personnalisé

thx

+1

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

+0

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

+0

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 –

Répondre

0

Il n'y a pas de méthode prise en charge pour le faire dans WPF. La solution va impliquer soit des objets Path composites, soit de la fantaisie derrière la gymnastique. Cherchez-vous spécifiquement une implémentation de chemin triple-ligne?

+0

L'utilisation d'une propriété jointe pour contraindre la géométrie rend cela relativement facile. Voir ma réponse pour plus de détails. –

+0

Wow c'est plutôt cool. Je n'aurais jamais pensé à le faire de cette façon :). – jgraves

3

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.

  1. Démarrer avec PathGeometry.CreateFromGeometry() pour obtenir un PathGeometry pour le chemin d'entrée
  2. utilisation GetWidenedPathGeometry(), en passant dans l'espacement souhaité, pour obtenir une nouvelle géométrie dont les bords correspondent aux lignes latérales
  3. (optionnel) Retirer les segments à la fin de la géométrie élargie, si désiré
  4. Combiner la ligne latérale geomerty avec la géométrie d'origine en utilisant un CombinedGeometry
  5. 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:

  1. 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.
  2. Supprimez des parties de la géométrie dans les zones "embout" du dessin d'origine et mettez-les de côté.
  3. 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.
  4. 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.

+0

thx .. j'ai besoin de quelque chose comme un coup de pinceau adobe, où vous pouvez pratiquement appliquer le motif le long du chemin ... je le fais à bas niveau pour le moment, avec des résultats ok. – Chandimal

+0

J'ai ajouté plus d'informations à ma réponse décrivant comment j'ai implémenté des traits personnalisés arbitraires dans WPF comme ceux d'Adobe. J'espère que ça aide. –