Domanda

Ho un WPF DataTemplate con due controlli TextBlock (impilate) e poi alcuni altri elementi sottostanti. A causa di alcuni codice del layout complicato, ho bisogno di conoscere l'altezza dei due elementi TextBlock modo che io possa trarre alcune linee di connessione di fantasia, e allineare gli altri controlli, ecc.

Se io so il testo che sta succedendo nelle TextBlocks, e so che il tipo di carattere, ecc, c'è qualche modo per calcolare o misurare l'altezza di questi TextBlocks senza peraltro riuscire a rendere?

È stato utile?

Soluzione

Credo che dovrebbe essere sufficiente per chiamare il UIElement.Measure(Size) metodo e successivamente controllare il UIElement.DesiredSize proprietà. Per ulteriori informazioni, controllare i link forniti MSDN.

Altri suggerimenti

La chiamata alla UIElement.Measure(Size), prende come parametro Size. La seconda chiamata restituisce UIElement.DesiredSize qualunque Size si passato nel metodo Measure.

Credo che questo è il caso, perché UIElement (TextBlock in questo caso) non è un bambino di qualsiasi controllo (ancora) e quindi DesiredSize non ha motivo di essere qualcosa di diverso.

Mi rendo conto che questa è una domanda un po 'vecchia, ma ho trovato che utilizzando il seguente codice

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

dsrdSize viene restituito come {} 47.05,15.96. Il trucco sembra fare il msrSize più grande della dimensione reale atteso. msrSize sembra agire come un limite per il risultato DesiredSize (). Ad esempio, utilizzando msrSize = new Size (10, 10), i risultati in un dsrdSize di {10,10} qui. Spero che questo aiuta qualcuno.

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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top