Comment puis-je mesurer la taille d'un TextBlock dans WPF avant qu'elle ne soit rendue?

StackOverflow https://stackoverflow.com/questions/2988622

  •  24-10-2019
  •  | 
  •  

Question

I ai un DataTemplate WPF avec deux contrôles TextBlock (empilés), puis d'autres éléments en dessous. En raison du code de mise en page complexe, je dois connaître la hauteur des deux éléments TextBlock pour que je puisse en tirer des lignes de connexion de fantaisie, et aligner d'autres contrôles, etc.

Si je connais le texte qui va dans les TextBlocks, et je sais que la police, etc., est-il une façon que je peux calculer ou mesurer la hauteur de ces TextBlocks sans réellement les rendre?

Était-ce utile?

La solution

Je pense qu'il devrait être suffisant pour appeler le UIElement.Measure(Size) procédé et ensuite vérifier la UIElement.DesiredSize . Pour plus d'informations, consultez les liens MSDN fournis.

Autres conseils

L'appel à UIElement.Measure(Size), prend comme paramètre Size. Le second retourne UIElement.DesiredSize d'appel que vous Size passé dans la méthode Measure.

Je pense que cela est le cas parce que UIElement (TextBlock dans ce cas) n'est pas un enfant de tout contrôle (encore) et donc DesiredSize n'a aucune raison d'être quelque chose de différent.

Je comprends que cette question est un peu vieux, mais je l'ai trouvé qu'en utilisant le code suivant

        TextBlock textBlock = new TextBlock();
        textBlock.Text = "NR valve";
        Size msrSize = new Size(100, 200);
        textBlock.Measure(msrSize);
        Size dsrdSize = textBlock.DesiredSize;

dsrdSize est retourné comme {} 47.05,15.96. L'astuce semble faire la msrSize plus grande que la taille réelle attendue. msrSize semble agir comme une limite pour le résultat DesiredSize (). Par exemple, en utilisant msrSize = new Taille (10, 10), les résultats dans un dsrdSize de {} 10,10 ici. Espérons que cela aide quelqu'un.

public static Size ShapeMeasure(TextBlock tb) {
    // Measured Size is bounded to be less than maxSize
    Size maxSize = new Size(
         double.PositiveInfinity, 
         double.PositiveInfinity);
    tb.Measure(maxSize);
    return tb.DesiredSize;
}

public static Testit() 
{
    TextBlock textBlock = new TextBlock();
    textBlock.Text = "NR valve";

    Size text size = ShapeMeasure(textBlock);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top