2011-02-03 8 views
7

C'è un modo per ottenere la dimensione di un UIElement che risiede in memoria e non è stato ancora eseguito il rendering?WPF - Ottieni dimensioni di UIElement in memoria?

Attualmente ho una routine che crea un Grid da un DataTable e quindi aggiunge la griglia in un FixedDocument. Devo conoscere la dimensione del Grid perché voglio passare automaticamente da verticale a orizzontale se necessario; o addirittura modificare il FontSize della griglia.

risposta

16

È necessario forzare un rendering dell'elemento o attendere che l'elemento sia reso. È quindi possibile utilizzare le proprietà ActualHeight e ActualWidth.

Per imporre un rendering:

MenuItem item = new MenuItem(); 
    item.Header = "bling"; 
    item.Icon = someIcon; 
    //Force render 
    item.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity)); 
    item.Arrange(new Rect(item.DesiredSize)); 

In questo esempio il MenuItem non è stata data un'altezza esplicita o larghezza. Tuttavia, forzando il rendering lo renderà prendendo in considerazione il testo e l'icona dell'intestazione forniti.

+0

'MenuItem' non ha funzionato per me, ma' StackPanel' o 'Viewbox' lo ha fatto. – vossad01

+0

Non esiste una proprietà chiamata "ActualWidth" sulla classe "UIElement" :-( – Boris

+0

sì, questo ha funzionato per me. Sì, questo ha funzionato per me ..... –

1

È possibile determinarlo solo se è presente un set esplicito Width o Height. Anche in questo caso, a seconda dello scenario, potrebbe cambiare al momento del rendering, poiché il passaggio del layout non si verificherà fino al momento del rendering e verrà impostato ActualWidth/ActualHeight.

+0

Quindi la mia unica opzione è quella di eseguire ripetutamente il controllo utilizzando dimensioni e layout di pagina diversi finché non si adatta? –

+0

@Sonny: Che, o renderlo in qualche altra posizione ... Si può sempre usare RenderTargetBitmap, ecc, per provare a renderlo "fuori dallo schermo" e quindi regolare, se non si vuole che l'utente lo veda. .. –