Drucken unter Silverlight war ja als Thema für mich – mangels einer Anforderung – nie wirklich interessant – zumal es hier auch Wege drumherum gibt. Nun gibt es dieses Feature aber doch und schlussendlich habe ich dafür auch eine Anforderung erhalten. Blieb also nichts anderes übrig, als sich das Feature einmal genauer anzusehen.
Am Anfang der Geschichte steht die Klasse PrintDocument. Sie bietet folgende Möglichkeiten:
Methode/Event | Beschreibung |
BeginPrint | Wird nach dem Bestätigen des Druck-Dialogs aber vor dem eigentlichen Druckvorgang ausgelöst. |
PrintPage | Wird für jede zu druckende Seite ausgelöst und übernimmt die Aufgabe, das zu Druckende zu definieren. |
EndPrint | Wird ausgeführt, wenn der Druckvorgang fertiggestellt wurde (sowohl reguläres Ende des Druckens als auch bei einem Abbruch). |
Öffnet den Druckdialog und startet bei dessen Bestätigung den Druckvorgang. Als Parameter ist der Name des zu druckenden Dokumentes zu übergeben. |
Und so sieht es aus:
PrintDocument doc = new PrintDocument();
doc.BeginPrint += new EventHandler<BeginPrintEventArgs>(doc_BeginPrint);
doc.PrintPage += new EventHandler<PrintPageEventArgs>(doc_PrintPage);
doc.EndPrint += new EventHandler<EndPrintEventArgs>(doc_EndPrint);
doc.Print("MyDocument");
Interessant hierbei ist das Ereignis PrintPage. Der Handler dazu erhält ein Objekt vom Typ PrintPageEventArgs. Dieser stellt vier Eigenschaften zur Verfügung:
Eigenschaft | Beschreibung |
HasMorePages | Darüber kann festgelegt werden, ob weitere Seiten zu drucken sind. |
PageMargins | Liefert die Seitenränder der Seite mit Hilfe eines Thickness-Objektes zurück. |
PageVisual | Setzt das Objekt vom Typ Visual fest, welches ausgedruckt werden soll. |
PrintableArea | Liefert die Größe der druckbaren Fläche zurück. |
Wie in der Tabelle ersichtlich, kann per PageVisual festgelegt werden, welches Objekt vom Typ Visual ausgedruckt werden soll. Auf dieser Basis können nun zwei Anwendungsfälle abgedeckt werden:
- Es wird ein bestehendes Visual herangezogen und (quasi á la Screenshot) ausgedruckt.
- Programmatisch wird ein Visual mit den notwendigen Informationen und Elementen erzeugt, welches ausgedruckt wird.
Der erste Fall läßt sich mit herkömmlichen Boardmitteln sehr gut abdecken und muss nicht zwangsweise über Silverlight behandelt werden. Der zweite Fall ist hierbei schon durchaus interessanter, da eigene Drucksichten gebastelt werden kann. Dies ist zwar weniger interessant, wenn es sich um eine LOB-Silverlight-Anwendung handelt und im Kontext einer größeren Online-Anwendung eingebettet ist. Für andere Szenarien ist die Möglichkeit aber durchaus verwendbar.