Come posso misurare la dimensione di un TextBlock in WPF prima del rendering?
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?
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);
}