J'ai le style suivant: 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
5 Réponses :
Je pense que le problème est que Vous pouvez utiliser Cette approche si vous êtes Heureux d'utiliser un textblock.textDecorations code> n'est pas défini sur
étiquette code>. p>
textblock code> plutôt que d'une étiquette code> code>. p>
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> Ceci traduit en interne à: p> 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> 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> fyi, c'est la chose la plus laide que j'ai faite dans WPF jusqu'à présent, mais cela fonctionne! p> 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> 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>
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: , alors faites attention.
Merci, Anvaka. J'ai mis à jour la réponse pour inclure votre aperçu. Dommage sur moi pour ne pas tester cela correctement. J'avais déjà mis à jour mon étiquette avec le texte explicite en dessous de cela.
Suite à la réponse de Jerry, afin d'éviter d'ajouter le texte TextBlock dans le gabarit à chaque fois que vous pouvez laisser le style le faire aussi en ajoutant la propriété de setter dans le style:
<Label Content="Test!" Style="{StaticResource ActionLabelStyle}" />
Ceci a l'air génial - mais contentpresenter ne semble pas être valide à cet endroit
Juste pour ajouter ma solution de contournement au mélange. J'utilise actuellement C # Code et cela fonctionne assez bien. Je viens de piéger les événements de Mouseleave et de Mouseener et montrez le soulignement là-bas.
void Control_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e) { WPFHelper.EnumerateChildren<TextBlock>(this, true).ForEach(c => c.TextDecorations = null); } void Control_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e) { WPFHelper.EnumerateChildren<TextBlock>(this, true).ForEach(c => c.TextDecorations = TextDecorations.Underline); }
Une ancienne question, mais depuis que je viens de me battre avec cela, voici ma méthode. Bien que cela utilise simplement une gâchette par opposition à un multi-chiffret
pour xaml: p> pour c # codeBeHind: p> Hasinitialisé étant un bool qui est défini sur False dans le constructeur et FindVisualChild provenant de ici . p> p>