2010-08-31 13 views
7

La nostra applicazione ha un numero di oggetti su una tela; la tela è contenuta in un visualizzatore di scorrimento. Abbiamo anche un controllo a scorrimento e alcuni pulsanti, sempre centrati nella parte superiore della finestra.
Sto provando a stampare l'applicazione acquisendo una bitmap dell'applicazione, ma senza alcuna "decorazione": cursore, pulsanti o barre di scorrimento.SL 4 - Ridisegno forzato dell'albero visivo

 _scrollViewer.HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden; 
     _scrollViewer.VerticalScrollBarVisibility = ScrollBarVisibility.Hidden; 
     var s = xSlider; 
     s.Visibility = Visibility.Collapsed; 
     var b = xPlusButton; 
     b.Visibility = Visibility.Collapsed; 
     b = xMinusButton; 
     b.Visibility = Visibility.Collapsed; 

     b = xButton; 
     b.Visibility = Visibility.Collapsed; 

Il cursore ei pulsanti sono nascosti, come previsto, ma le barre di scorrimento no.
Sospetto che l'applicazione debba ridisegnare il layout per nascondere le barre di scorrimento. C'è un modo per farlo accadere? Ciò è reso più complicato dal fatto che l'operazione di stampa in SL 4 deve essere avviata da un gesto dell'interfaccia utente; non c'è modo (AFAIK) di iniziare in modo programmatico, quindi questo ridisegno deve avvenire in uno dei gestori di eventi di PrintDocument.

Grazie per eventuali suggerimenti ....

+0

Puoi mostrare l'Xaml della tela che stai stampando? Il commento "Catturare una bitmap" suona un po 'fuori, puoi fare l'eloborate? – AnthonyWJones

+0

Non riesco davvero a mostrare l'xaml, dal momento che tutti gli oggetti vengono aggiunti in fase di esecuzione e fanno un uso pesante dei modelli. Credo che i modelli causino il danno; dopo aver passato la tela al PrintDocument, l'albero non viene mai ridisegnato (almeno non completamente). Ciò che appare come output di stampa sono molti oggetti mancanti o non disegnati in modo incompleto. Stiamo cercando di catturare una bitmap della tela per aggirare il problema dell'oggetto disegnato in modo incompleto. – Number8

+0

Puoi pubblicare il tuo codice per catturare bitmap? –

risposta

7

prova a seguire,

canvas.InvalidateMeasure(); 
canvas.InvalidateArrange(); 

alternativa è possibile utilizzare WritableBitmap per catturare l'immagine di runtime e inviare immagini per stampare documenti se nel caso di stampa di documenti sta ignorando render trasformare .

Inoltre, se si utilizza WritableBitmap per acquisire l'elemento, è necessario restituire RenderTransform come secondo argomento. Puoi pubblicare il tuo codice per catturare lo schermo?

+0

Per favore segna questo come risposta se ti ha aiutato. –

+0

+1 per aver capito bene! Questo era esattamente ciò di cui avevo bisogno per forzare l'evento LayouUpdated a sparare. – dFlat

2

In aggiunta ai metodi InvalidateMeasure e InvalidateArrange, come suggerito da Akash, è possibile provare il metodo UpdateLayout.

I due metodi invalidati contrassegneranno la misura del controllo o organizzeranno come se fosse necessario eseguirli nuovamente, ma non lo faranno necessariamente immediatamente. L'UpdateLayout lo costringerà ad eseguire alcuni aggiornamenti immediatamente.

È un po 'una scatola nera, quindi potrebbe essere necessario invalidare quindi chiamare UpdateLayout. A volte potrebbe essere sufficiente chiamare UpdateLayout.