¿Cómo mido el tamaño de un bloque de texto en WPF antes de que se represente?
Pregunta
Tengo una plantilla de datos WPF con dos controles de bloqueo de texto (apilados) y luego algunos otros elementos debajo. Debido a un código de diseño complicado, necesito saber la altura de los dos elementos de bloqueo de texto para poder dibujar algunas líneas de conector elegantes y alinear otros controles, etc.
Si conozco el texto que está entrando en los bloques de texto, y conozco la fuente, etc., ¿hay alguna forma de calcular o medir la altura de estos bloques de texto sin realmente representarlos?
Solución
Creo que debería ser suficiente llamar al UIElement.Measure(Size)
método y posteriormente verificar el UIElement.DesiredSize
propiedad. Para obtener más información, consulte los enlaces MSDN proporcionados.
Otros consejos
La llamada a UIElement.Measure(Size)
, toma como parámetro Size
. La segunda llamada UIElement.DesiredSize
devuelve lo que sea Size
Pasaste al Measure
método.
Creo que este es el caso porque UIElement
(TextBlock
en este caso) no es un niño de ningún control (todavía) y, por lo tanto, DesiredSize
no tiene razón para ser nada diferente.
Aprecio que esta sea una pregunta bastante antigua, pero he descubierto que usar el siguiente código
TextBlock textBlock = new TextBlock();
textBlock.Text = "NR valve";
Size msrSize = new Size(100, 200);
textBlock.Measure(msrSize);
Size dsrdSize = textBlock.DesiredSize;
Dsrdsize se devuelve como {47.05,15.96}. El truco parece ser hacer que el MSRSize sea más grande que el tamaño real esperado. MSRSIZE parece actuar como un límite para el resultado deseado (). Por ejemplo, el uso de msrsize = new size (10, 10), da como resultado un dsrdsize de {10,10} aquí. Espero que esto ayude a alguien.
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);
}