2012-01-13 12 views
6

Qualcuno può individuare l'errore che sto facendo?Aggiunta di bambini allo stackpanel programmaticamente non funzionante

Ecco il codice:

 StackPanel stackPanel = new StackPanel(); 
     stackPanel.Orientation = Orientation.Vertical; 
     for (int index = _elements.Count - 1; index >= 0; index--) 
     { 
      FrameworkElement element = _elements[index]; 
      WriteableBitmap tempBitmap = new WriteableBitmap(element, null); 
      Image image = new Image(); 
      image.Source = tempBitmap; 
      stackPanel.Children.Add(image); 
     } 

     stackPanel.UpdateLayout(); 

     _bitmap = new WriteableBitmap(stackPanel, null); 

     _bitmap.Invalidate(); 

Come potete vedere sto creando un immagine temporaneo e quindi aggiungendolo al StackPanel e quindi la creazione di un WriteableBitmap finale. Myy 1st figli di StackPanel è di altezza 154 e 2 ° uno è di 389. Dopo questa linea:

_bitmap.Invalidate(); 

quando vedo PixelHeight è solo 389. Dove ha fatto il mio primo bambino andare?

risposta

2

Mentre entrambe le risposte date da sLedgem e bathineni sono corretti, non sembra per adattarsi mia situazione. Inoltre, perché dovrei aggiungerli al layout? Se è conveniente per te, puoi, ma nel mio caso, voglio che siano nella memoria al 100% perché la mia classe helper usata fondamentalmente per la stampa non aveva alcun riferimento a nessuno degli UIElements presenti sullo schermo. In questo caso ovviamente non vorrei passare il mio LayoutRoot o qualche altro Panel alla mia classe helper solo per fare questo hack!

Per chiedere al runtime di Silverlight di eseguire il rendering degli elementi nella memoria. È necessario chiamare Misurare e Arrange:

così tipicamente tutto quello che mancava era:

stackPanel.Measure(new Size(width, height)); 
stackPanel.Arrange(new Rect(0, 0, width, height)); 

prima:

_bitmap = new WriteableBitmap(stackPanel, null); 

E posso liberarmi di questa linea:

stackPanel.UpdateLayout(); 

Spero che questo aiuti qualcuno che viene su questo thread e abbia lo stesso problema come me dove non è possibile trovare LayoutRoo t nella tua classe di aiuto.

+0

Qualcosa da aggiungere, prova ad impostare l'altezza e la larghezza esplicitamente sul pannello dello stack e usarlo per impostare 'Size' e' Rect' –

0

stackPanel o qualsiasi altro pannello non renderà fino a quando non hanno aggiunto a visulatree (qualsiasi elemento visivo) .. significa .. se si sono aggiunti 100 elementi a stackpanel quei 100 elementi non verranno generati fino a quando il pannello di comando ha la sua apparenza visiva su schermata ..

se non si desidera mostrare lo stackpanel sullo schermo, quindi aggiungere lo stackpanel e rimuoverlo immediatamente. farà StackPanel renderlo elementi figli ...

O

creare una griglia o StackPanel in XAML, che ha 1 altezza in pixel e la larghezza e aggiungi il tuo StackPanel a quella griglia o StackPanel ... in modo da non essere visibile sullo schermo e sarà reso sullo sfondo ....

+0

La tua risposta è corretta ma non sempre fattibile. Vedi la mia risposta. – TCM

0

bathineni ha ragione, è necessario eseguire il rendering dello stackpanel prima di scattare un'istantanea. Vorrei suggerire lasciando che rende una cornice e poi prendete il bitmap dopo che si è reso

 CompositionTarget.Rendering += CompositionTarget_Rendering; 
} 

void CompositionTarget_Rendering(object sender, EventArgs e) 
    { 
    _bitmap = new WriteableBitmap(stackPanel, null); 
    _bitmap.Invalidate(); 

    } 
+0

Anche se è corretto, non è sempre possibile. Vedi la mia risposta. – TCM

Problemi correlati