2011-12-29 13 views
6

Sto cercando di ottenere l'ActualSize di MyUserControl prima che venga eseguito il rendering utilizzando il metodo Measure della classe UserControl come suggerito per il mio previous question. Tuttavia non sta funzionando. MyUserControl ha un ItemsControl che è un database con uno List come illustrato di seguito. Gli articoli aggiunti tramite uc.MyCollection = myCollection; non vengono visualizzati in uc.DesiredSize.Height.Ottenere le dimensioni effettive di UserControl prima del rendering

MyUserControl uc= new MyUserControl(); 
uc.AName = "a1"; 
uc.Width = 194; 
uc.MyCollection = myCollection; //myCollection is a List databound to ItemsControl inside MyUserControl 
uc.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
uc.Arrange(new Rect(0, 0, uc.DesiredSize.Width, uc.DesiredSize.Width)); //Needed? 
uc.UCHeight = uc.DesiredSize.Height; //size of items databound to ItemsControl not reflected here 
uc.UCWidth = uc.DesiredSize.Width; 
uc.Margin = new Thickness(34, 42, 0, 0); 
myRoot.Children.Add(uc); //myRoot is Canvas 
+3

Provate ad aggiungere il 'uc' alla radice prima di richiamare' Mesaure() 'e fare un' UpdateLayout() 'prima di accedere a' DesiredSize'. Questo è quello che faccio di solito. – kev

+0

Questo non funziona. – devnull

+0

@neutrino: cosa non funziona? I valori sono 0 o non sono esatti? I valori – Tigran

risposta

6

dovete ignorare MeasureOverride e ArrangeOverride nel vostro uc per calcolare le dimensioni per il proprio. All'interno di MeasureOverride "chiedi" al tuo Elenco con "Misura" della sua dimensione - in modo che tu possa calcolare la dimensione per il tuo uc (restituendo questa dimensione in MeasureOverride) - quindi ottieni il tuo DesiredSize dopo aver chiamato uc.Misura.

+2

Sono abbastanza sicuro che è necessario implementare questi metodi solo su implementazioni di pannelli personalizzati. Un UC è semplicemente un insieme di altri controlli, quindi non è necessario implementarli. – ColinE

+0

Cosa succede se il controllo utente ha un 'ItemsControl' associato a un' Elenco'? Dopo aver creato l'usercontrol, sto impostando l'assegnazione della proprietà 'List' a cui' ItemsControl' di 'UserControl' è associato. Il problema è che la chiamata 'Measure' su usercontrol restituisce' DesiredSize.Height' senza tenere conto dell'altezza di 'ItemsControl'. – devnull

1

vostro ItemsControl legame MyCollection non sarà processo fino a quando il controllo utente è nel VisualTree, quindi al punto di chiamare Misura, DesiredSize è ancora 0.

Quando ho bisogno per ottenere la dimensione di un FrameworkElement, Ho impostato Opacity su 0, lo aggiungo all'albero visivo e aspetto l'evento SizeChanged.

Problemi correlati