2010-08-31 9 views
7

Unsere Anwendung hat eine Reihe von Objekten auf einer Leinwand; Die Arbeitsfläche ist in einem Scroll-Viewer enthalten. Wir haben auch einen Schieberegler und einige Tasten, immer im oberen Bereich des Fensters zentriert.
Ich versuche, die Anwendung zu drucken, indem Sie ein Bitmap der App, aber ohne "Dekorationen" - Schieberegler, Schaltflächen oder Bildlaufleisten erfassen.SL 4 - Neuzeichnen des visuellen Baums erzwingen

Der Schieberegler und die Schaltflächen sind wie erwartet ausgeblendet, die Bildlaufleisten jedoch nicht.
Ich vermute, dass die Anwendung das Layout neu zeichnen muss, um die Bildlaufleisten auszublenden. Gibt es eine Möglichkeit, dies zu erreichen? Dies wird dadurch komplizierter gemacht, dass die Druckoperation in SL 4 durch eine UI-Geste initiiert werden muss; Es gibt keine Möglichkeit (AFAIK), programmatisch zu initiieren, daher muss dieses Redraw in einem der Ereignishandler PrintDocument geschehen.

Vielen Dank für alle Vorschläge ....

+0

Können Sie den Xaml des zu druckenden Canvas anzeigen? Der Kommentar "Capturing a Bitmap" klingt ein wenig ab, können Sie sich vorstellen? – AnthonyWJones

+0

Ich kann die XAML nicht wirklich anzeigen, da alle Objekte zur Laufzeit hinzugefügt werden und Vorlagen stark genutzt werden. Ich glaube, es sind die Vorlagen, die den Unfug verursachen; Nach dem Übergeben des Canvas an das PrintDocument wird der Baum nie neu gezeichnet (zumindest nicht vollständig). Was sich als Druckausgabe zeigt, sind viele fehlende oder unvollständig gezeichnete Objekte. Wir versuchen, eine Bitmap des Canvas zu erfassen, um das unvollständig gezeichnete Objektproblem zu umgehen. – Number8

+0

Können Sie Ihren Code zum Erfassen von Bitmap posten? –

Antwort

7

Versuchen folgen,

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

Sie alternativ WritableBitmap verwenden können, um Laufzeitbild zu erfassen und Bild senden Dokument zu drucken, wenn im Falle Druckdokument render ignoriert verwandeln .

Auch wenn Sie WriteableBitmap zum Erfassen des Elements verwenden, sollten Sie RenderTransform als zweites Argument angeben. Kannst du deinen Code auf dem Bildschirm erfassen?

+0

Bitte markieren Sie dies als Antwort, wenn es Ihnen geholfen hat. –

+0

+1 um es richtig zu machen! Dies war genau das, was ich brauchte, um das LayouUpdated-Ereignis zu erzwingen. – dFlat

2

Zusätzlich zu den Methoden InvalidateMeasure und InvalidateArrange, wie von Akash vorgeschlagen, können Sie die Methode UpdateLayout ausprobieren.

Die beiden Invalidate-Methoden markieren die Maßnahme des Steuerelements oder veranlassen, dass sie erneut ausgeführt werden muss, tun dies jedoch nicht unbedingt sofort. Das UpdateLayout wird es zwingen, einige Updates sofort auszuführen.

Es ist ein bisschen eine Black Box, so müssen Sie möglicherweise ungültig machen und dann UpdateLayout aufrufen. Manchmal müssen Sie nur UpdateLayout aufrufen.

Verwandte Themen