7
votes

Créer un cadre personnaliséContEvention pour ajouter une ligne diagonale sur le texte dans WPF

Y a-t-il un moyen de créer un caderie personnalisé (ou un inline ) qui dessine une ligne diagonale sur son contenu?

Quelque chose comme la décoration de la grève, mais avec une forme diagonale: exemple de décorations de grève et de diagonale

Il n'est pas possible d'inhérent à partir de TextDecoration ou TextEffect (ils sont scellés).

aucune idée?


0 commentaires

3 Réponses :


0
votes

Mettez votre texte dans une toile ou une grille (quelque chose qui permet aux contrôles de se chevaucher) et d'ajouter un objet de ligne avec ses points X / Y liés à votre position TextBlock

quelque chose comme ceci: p>

<Canvas HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Yellow">
    <TextBlock x:Name="TestText" Text="This is a Test"  />
    <Line X1="{Binding ElementName=TestText, Path=ActualWidth}"
            Y1="{Binding ElementName=TestText, Path=ActualHeight}"
            X2="{Binding ElementName=TestText, Path=Canvas.Left}"
            Y2="{Binding ElementName=TestText, Path=Canvas.Top}"
            Stroke="Red" StrokeThickness="2" />
</Canvas>


3 commentaires

Merci Rachel, bien sûr, cela ferait le travail, mais la question est plus sur Extende des décorations que de dessiner une ligne.


Personnellement, je créerais un usercontrol personnalisé qui implémente ce style et l'utiliserait simplement à la place d'un texte texte ou d'une étiquette lorsque vous souhaitez ce comportement. Comme alternative, vous pourriez écrire une propriété attachée qui fait la même chose.


C'est en quelque sorte mon point: il est facile d'étendre un contrôle mais pas un contrôle intégré (au cas où vous préférez l'utiliser directement au lieu de l'envelopper à l'intérieur d'une ligne d'entreprise). De plus, quelque chose comme dessiner une ligne sur le texte ressemble plus à une décoration ou à un effet. Vous ne pouvez même pas utiliser des ornières avec un élément en ligne.



6
votes

mise à jour :

J'ai essayé de créer un exemple aussi minime que possible. Dans des scénarios plus complexes, vous devrez l'étendre. Voici comment il regarde:

Entrez la description de l'image ici

Ceci est le xaml correspondant: xxx

et c'est le codeBeHind: xxx

amusez-vous!

Message original :

Ceci est généralement assez difficile. J'ai réussi à joindre un adorateur à des éléments spécifiques dans les débitchumments, mais il existe de nombreuses angoisses à considérer. Par exemple: Qu'est-ce qui est censé arriver si cette inline est enroulée? En outre: si ce flowdocument se trouve dans une richtextbox, ses internes continuent de réorganiser les courses (jointes ou les séparant), ce qui fait très mal de tout. Vous devez mettre les choses avec précaution.

Veuillez élaborer plus d'informations sur l'endroit où cette inline va être à. Dans un flowdocumentscrollswirkviewer? Ou un textblock? Ou une richtextbox? Comme vous devez attacher l'adorneur au cadre général (comme vous l'avez probablement déjà remarqué, vous ne pouvez pas attacher un adorneur à un frameworkContelement directement), nous devons savoir où l'inline est assise.

Je vais décrire le général Route pour comment accomplir cela: Créez une propriété attachée qui va créer l'Adorner. La propriété ci-jointe est définie sur la ligne en ligne qui va être ornée. L'Adorner conserve une référence à la formation continue et est attachée au cadre général. Subscibe à la mise en place de cet établissement et faire une invalide visuelle sur l'Adorner. Les orgrateurs OnRender dessine la ligne avec des coordonnées en fonction des inlines Contentpart et contentend getcharacterrect rectangles. fait.


2 commentaires

Oh! Cela ressemble à une longue route! Mon plan initial l'utilisait comme une course, mais j'irais pour le "flowdocument inside" maintenant.


Wow! Et pour un effet diagonal, il est logique de garder la partie entière non-cassable (en enveloppement). Merci beaucoup.



1
votes
var adornerLayer = AdornerLayer.GetAdornerLayer((Visual) parent);
            if(adornerLayer == null)

0 commentaires