12
votes

Étiquette soulignée dans WPF, en utilisant des styles

J'ai le style suivant: xxx

Donc, je veux avoir une étiquette soulignée lorsqu'il est activé et que le curseur de la souris est sur celui-ci. La partie de ce style qui ne fonctionne pas est la . Maintenant, qu'est-ce que je fais mal ici? Merci pour votre aide.


0 commentaires

5 Réponses :


3
votes

Je pense que le problème est que textblock.textDecorations n'est pas défini sur étiquette .

Vous pouvez utiliser Cette approche si vous êtes Heureux d'utiliser un textblock plutôt que d'une étiquette .


0 commentaires

23
votes

Ceci est effectivement beaucoup plus difficile qu'il n'apparaît. Dans WPF, une étiquette n'est pas un texte de texte. Il dérive de contenuControl et peut donc héberger d'autres contrôles non-texte dans sa collection de contenu.

Cependant, vous pouvez spécifier une chaîne comme contenu que dans l'exemple ci-dessous. En interne, une textblock sera construite pour héberger le texte pour vous. P> xxx pré>

Ceci traduit en interne à: p> xxx pré>

le Une solution simple à ceci serait pour la propriété TextDecorations d'une text-alléchante d'être une propriété attachée. Par exemple, Fontsize est conçu de cette façon, de sorte que les travaux suivants: p> xxx pré>

la propriété textblock.fontsize peut être appliqué n'importe où dans l'arborescence visuelle et remplacera la valeur par défaut pour cette propriété sur tout descendant de texte de texte dans l'arbre. Cependant, la propriété TextDecorations n'est pas conçue de cette manière. P>

Cela vous laisse avec au moins quelques options. P>

  1. Utilisez la couleur, la frontière, le curseur, etc., au lieu de texte souligné, car il est 100% plus facile à mettre en œuvre. LI>
  2. Changez la façon dont vous faites cela pour appliquer le style à la textblock à la place. LI>
  3. Allez au problème pour créer Votre propre propriété ci-jointe et le modèle de contrôle pour le respecter. li>
  4. Faites quelque chose comme ce qui suit pour imbriquer le style des text-allées qui apparaissent comme des enfants de votre style: Li> ol>

    fyi, c'est la chose la plus laide que j'ai faite dans WPF jusqu'à présent, mais cela fonctionne! p> xxx pré>

    Ceci fonctionne car il remplace la valeur par défaut style de tout texte de texte sous une étiquette de ce style. Il utilise ensuite un multidatatrigger pour permettre une reliure relative à l'étiquette pour vérifier si sa propriété ISmouseover est vraie. Yuck. P>

    Edit: strong> p>

    Notez que cela ne fonctionne que si vous créez explicitement le texte TextBlock. J'étais incorrect quand j'ai posté ceci parce que j'avais déjà hésité mon étiquette de test. Huer. Merci, Anvaka, pour le pointant sur cette sortie. P>

        <Label Style="{StaticResource ActionLabelStyle}">
            <TextBlock>Test!</TextBlock>
        </Label>
    


5 commentaires

Jerry, tu as vraiment fait beaucoup de travail ici. Merci pour vos efforts. Je pense que je vais aller avec la première option que vous avez recommandée. Le style que vous avez fourni fait l'affaire, mais c'est aussi "Yuck" comme vous l'avez dit - Yuck en effet. Je marquais votre réponse comme correct. Encore une fois, merci pour la réponse!


Merci, Boris. J'ai fait plus de travail que d'habitude pour une réponse, mais des problèmes similaires à celui-ci m'ont dérangé depuis un peu de temps, de sorte que les recherches que j'ai faites étaient assez utiles pour ma propre édification. :)


+1 - belle réponse jerry. J'ai appris quelque chose, même si j'aurais aimé n'avoir pas :)


Bonne réponse :). Vous n'avez pas besoin d'avoir une propriété isenabled dans la gâchette. Si c'est désactivé, il ne reçoit pas d'événement de Mousever. De plus, il ne fonctionnera pas si vous définissez le contenu directement dans l'étiquette: