Centre de texte à un point donné sur une Toile WPF
J'ai un Controls.Canvas
avec plusieurs formes et souhaitez ajouter des étiquettes textuelles qui sont centrés sur des points donnés (je suis le dessin d'un arbre avec des sommets étiquetés). Quelle est la façon la plus simple de le faire par programmation dans WPF?
J'ai essayé de réglage RenderTransform
et de l'appel de Controls.Canvas.SetLeft
etc. mais ni la position de l'étiquette où je veux. WPF semble à l'appui de positionnement seulement à gauche, à droite, en haut et en bas les coordonnées et non centrée sur une coordonnée donnée et la Width
propriété est NaN
et la ActualWidth
propriété est 0.0
quand je construis le Canvas
.
Vous devez vous connecter pour publier un commentaire.
Vous pourrait atteindre ce niveau par liaison de la marge de l'étiquette sur le
ActualWidth
etActualHeight
de l'étiquette, et en multipliant ces valeurs avec -0.5. Cela déplace l'étiquette de gauche par la moitié de sa largeur; et il se déplace l'étiquette vers le haut par la moitié de sa hauteur.Voici un exemple:
XAML:
Le rectangle rouge met en évidence les coordonnées (40, 40) sur lequel l'étiquette "hum hum" est centré.
Converter:
Le résultat ressemble à ceci:
Afin de faire de la programmation, de définir une propriété attachée
Mover.MoveToMiddle
, comme ceci:Réglage
Mover.MoveToMiddle
àtrue
signifie que la marge de ce cadre, l'élément est automatiquement lié à sa largeur et à la hauteur telle que le cadre de l'élément est déplacé vers son centre.Que vous pouvez l'utiliser dans votre code XAML comme ceci:
Une autre solution serait de se lier à
RenderTransform
au lieu deMargin
. Dans ce cas, le convertisseur devrait reveniret de la propriété attachée de rappel de la méthode contenant ces lignes:
Cette solution a l'avantage de l'effet de la propriété attachée est visible dans le concepteur Visual Studio (qui n'est pas le cas lors de la définition de la propriété de Marge).
Cela fonctionne aussi, avec moins contraignantes.
Et vous l'utilisez comme ça...
FrameworkElement
sur un point et de le garder centré, même lorsque cet élément de taille pourrait être en train de changer.Désolé Jon, je n'ai pas compris votre question tout le chemin hier sur Twitter.
Voici comment je pourrais l'essayer en F#,! @cammcad
#r @"C:\Program Files (x86)\de Référence
Assemblées\Microsoft\Framework\v3.0\PresentationFramework.dll"
#r @"C:\Program Files (x86)\de Référence Assemblies\Microsoft\Framework\v3.0\WindowsBase.dll"
#r @"C:\Program Files (x86)\de Référence Assemblies\Microsoft\Framework\v3.0\PresentationCore.dll"
Pour centrer le texte dans la zone donnée (par exemple, rectangle), vous pouvez simplement envelopper par
Grid
. Voir l'exemple dans cette réponse. La grille peut être placé n'importe où à l'intérieur de la toile à l'aide deLeft
,Top
,Width
etHeight
propriétés. Le texte restera toujours au centre de la grille.Cette logique peut être encapsulé dans une coutume FrameworkElement comme ceci.
Pour centrer le texte au point de
(x, y)
vous pouvez calculer approprié rectangle:où
(maxWidth, maxHeight)
est la taille maximale autorisée pour le texte.