magnify
Home Contribution Déterminer la taille physique d’un TextBlock
formats

Déterminer la taille physique d’un TextBlock

Pendant le développement d’une nouvelle application pour Windows Phone je me suis trouvé dans l’obligation de déterminer la taille physique d’un TextBlock.

Vous allez me dire, trop facile, il suffit de regarder sa propriété « ActualWidth » pour le savoir.

Et bien cette méthode ne fonctionne pas dans tous les cas de figure. En ce qui me concerne, mon TextBlock n’a pas de « Width » défini, et il est placé dans une des cellules d’une grille.

En regardant la valeur de la propriété « ActualWidth » de mon TextBlock, je me suis rendu compte qu’elle avait comme valeur, systématiquement, la taille du texte à afficher et non la taille utilisée pour l’affichage du contrôle à l’écran…

Donc si le TextBlock est visible sur 300 pixels à l’écran mais que son texte fait en tout 700 pixels, « ActualWidth » retourne 700 et non 300.

Si la longueur totale du texte à afficher dépasse la place disponible dans la cellule, le TextBock semble être bien placé dans la cellule, mais sa taille indique qu’en fait il « continue » au delà et son « ActualWidth » n’indique pas sa taille dans la cellule mais bien la taille théorique s’il devait afficher tout son contenu. Et ça, ça ne m’arrangeait pas du tout !

J’ai demandé conseil à d’autres développeurs Windows Phone et le grand Rudy Huyn m’a expliqué pourquoi le TextBlock avait ce comportement, voici son explication :

le TextBlock se dimensionne par rapport à son contenu et non par rapport à son parent, tout comme une image avec Stretch= »None ». Si le parent ne fait que 50 pixels de large, c’est le parent qui va découper (clip) tout ce qui dépasse, mais les enfants en soient existent toujours et leurs textures sont toujours aussi grandes. si je fais une analogie, moi je fais un trou dans mon mur de 25cm sur 25cm, je vois qu’une partie de l’immeuble en face, pourtant il existe en dehors de ma vision et ne fait pas que 25cm

Voilà au moins qui explique les choses, mais ça ne me permettait pas de récupérer la taille physique visible du TextBlock à l’écran, et c’est ça dont j’avais besoin.

La seule solution que j’ai trouvée est de placer le TextBlock dans un Border invisible et ensuite de lire le « ActualWidth » du Border au lieu de lire celui du TextBlock.

Comme dans ce cas, le Border à lire est le parent du TextBlock on peut passer directement par la propriété « Parent » du TextBlock, que l’on prendra soin de convertir en Border (car elle a par défaut le type DependencyObject) pour en tirer ensuite la largeur.

Voilà, en espérant que cette petite aventure au pays du TextBlock serve à d’autres..

 

 
 Share on Facebook Share on Twitter Share on Reddit Share on LinkedIn
No Comments  comments 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *