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?

¿Fue útil?

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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top