2010-02-03 8 views
15

Als ich Bücher über WPF las, sah ich, dass die Autoren XPS als etwas Wichtiges nannten. Windows enthält auch seinen XPS-Viewer, und ich habe gesehen, dass dies als "Feature" von Windows aufgeführt ist.Was ist der Sinn von XPS?

Aber warum? Was ist der Punkt? Wer zum Teufel benutzt es? Es ist mein Verständnis, dass XPS ist im Grunde, wie PDF, XHTML oder ePub (das ist nur XHTML) ... oder sogar Word docx Format. Viele der Funktionen sind unter diesen Formaten identisch.

Es scheint keine wesentlichen Vorteile gegenüber diesen anderen Formaten zu haben. Es scheint mir, dass XHTML so viel nützlicher als XPS wäre, um FlowDocuments von der RichTextBox zu speichern und zu laden. Ich habe mehrere Blogs über die Konvertierung zwischen den beiden betrachtet. Der meiste oder der gesamte Rich Text im Internet ist (x) html. Darüber hinaus glaube ich nicht, dass irgendjemand es benutzt, um seine Dokumente zu veröffentlichen. PDF ist bevorzugt. Es scheint, als wäre XPS nur ein zufälliges Format, das MS gemacht hat und entschieden hat, es zu pushen. Ich liebe generell MS, aber sie haben die Angewohnheit, so etwas zu tun. Könnte MS nicht eine API mit xhtml stattdessen gemacht haben? Das wäre in vielen Situationen nützlicher gewesen, denke ich.

Also, hat es einen Sinn, XPS zu benutzen, besonders im Vergleich zu einem der anderen Formate, die ich erwähnt habe (oder irgendwelche, die ich nicht erwähnt habe)? Haben Sie jemals XPS in Ihren Programmen oder anderweitig verwendet?

Antwort

8

Wie in U62 bereits erwähnt, verfügt WPF über ein DocumentViewer-Steuerelement, mit dem Sie XPS-Dokumente anzeigen können. Der DocumentViewer hat auch einige nützliche Funktionen wie Print, Zoom, FitToPage etc ... Sie müssen das also nicht implementieren oder ein Drittanbieter-Tool verwenden.

Was ich gerade vor einer Stunde mit XPS und dem DocumentViewer fertiggestellt habe, war eine Art "Druckvorschau". Ermöglichen Sie dem Benutzer, einige Kontakte aus einer Liste von Kontakten auszuwählen, klicken Sie auf "Seitenansicht". Dies öffnet ein neues XAML-Fenster, das ein DocumentViewer-Steuerelement und eine ListBox mit der Auswahl verschiedener Labels enthält (z. B. 1 Blatt mit 12 Etiketten [2 Spalten, 6 Zeilen], 1 Blatt mit einem einzelnen Label, dessen Breite und Höhe vom Benutzer definiert werden kann) . Basierend auf der Benutzerauswahl erzeuge ich ein XPS-Dokument in dem Layout, das der Benutzer mit den Adressen der ausgewählten Kontakte ausgewählt hat. Wenn z.B. Der Benutzer hat 4 Kontakte ausgewählt und möchte sie auf "SingleLabelSheet" drucken. Ich erstelle 1 XPS-Dokument mit 4 Seiten, wobei jede Seite 1 Adresse enthält. Dann zeige ich das XPS im DocumentViewer an und der Benutzer kann die Etiketten auf unserem Etikettendrucker drucken.

Sobald ich verstanden habe, wie die XPS-API funktionierte (zumindest die Grundlagen), war es eine Sache von 2 Stunden, um dies zu starten und zu betreiben.

Also, im Grunde sehe ich XPS als eine einfach zu bedienende API zur Anzeige von FixedDocuments, die im laufenden Betrieb generiert werden sollen. Aber ich würde nicht persönlich daran gehen, sie auf meiner Festplatte zu speichern oder sie irgendwie zu modifizieren oder was auch immer man mit Dokumenten macht.

3

Der einzige tatsächliche Vorteil, den ich denken kann, ist, dass Sie ein Steuerelement zum Anzeigen von XPS-Dokumenten in WPF-Anwendungen haben. Die anderen Formate, die Sie erwähnen, bedeuten, dass Sie einen Renderer eines Drittanbieters mitbringen müssten (oder schreiben Sie selbst, wenn Sie ein Jahr übrig haben).

btw. Ich weiß nicht viel über ePub, aber XPS ist nicht direkt vergleichbar mit XHTML, es ist eher wie PDF, da es ein festes Layout hat.

3

XPS zu WPF ist wie WMF zu Win32/WinForms, es ist ein beständiges Format, in dem Sie native WPF-Grafiken speichern und drucken können.

XPS wird verwendet von WPF drucken (auch wenn Sie sich ohne speichern, das interne Drucksystem auf XPS gebaut direkt aus der Anwendung drucken) so was MS tun soll:

  1. ein neues Dateiformat erstellen, die genau passend zu dem, was sie versuchen
  2. Erstellen Sie einen 100% perfekten Übersetzer von WPF in ein Format, das nicht wie PDF gesteuert wird (und hofft, dass Adobe mit der nächsten Version von Acrobat Reader nicht alle WPF-Anwendungen außer Kraft setzt).

Was würden Sie tun?

Speichern von XPS-Dateien ist nur ein netter Bonus.

+0

Ich würde versuchen, es mit herkömmlichen Dingen, die Menschen tatsächlich verwenden, arbeiten zu lassen. –

+0

Es sollte wahrscheinlich erwähnt werden, dass XPS nicht nur auf WPF beschränkt ist, sondern indirekt auch mit Win32 oder WinForms verwendet werden kann. Windows XP und neuere Systeme installieren standardmäßig einen XPS-Drucker, der zum Generieren von XPS-Dokumenten verwendet werden kann. – stakx

3

Sehen Sie, ich bin vielleicht ein Pessimist auf XPS als Lösung zur Berichterstellung, aber ich habe es versucht und fand die anfängliche Dokumentation schwer zu verstehen, mit weniger realen Beispielen, als ich es mir gewünscht hätte. Als ich es in eine reale Geschäftsanwendung einbrachte, fand ich es frustrierend, besonders in LOB-Apps, die Tabellen benötigen, die sich über mehrere Seiten erstrecken.

Die Dinge haben sich seither geändert, aber sobald ich anfing, Tabellen zu betrachten, die sich über mehrere Seiten erstreckten und Spaltenüberschriften nach oben suchten, usw., stellte ich fest, dass die API das benötigte, was ich nennen würde übermäßige Workarounds mit unnötiger Komplexität.

Also, die Dinge haben sich seit damals (vor etwa 8 Monaten) geändert, aber ich ging von XPS zu ITextSharp und das war viel weniger schmerzhaft. Der einzige Vorteil, den ich sagen würde, wie jeder andere auch, ist der eingebaute Viewer in WPF - aber abgesehen davon denke ich, dass die API ein bisschen mehr "reifen" muss, bevor ich etwas erneut in sie hinein versuche.

1

Eigentlich fand ich einen wirklich guten Grund, XPS zu verwenden. Ich wollte von mehreren Quellen drucken, merge documents und Duplex und geheftet angeben. Schließlich sollte es als ein Dokument mit Duplex gedruckt und geheftet werden. Ich hatte eine schwierige Zeit damit, aber durch Drucken auf XPS (gespeichert auf Disc) konnte ich mein Ziel mit minimalem Aufwand erreichen. Ich habe keine andere Methode gefunden, die so einfach und unkompliziert ist.

Dim PrintServer As New SysPrint.PrintServer("\\" & My.Computer.Name) 
    Dim PrintQ As New SysPrint.PrintQueue(PrintServer, "Ricoh Main") 
    Dim Jobs As SysPrint.PrintJobInfoCollection = PrintQ.GetPrintJobInfoCollection 
    Dim able As SysPrint.PrintCapabilities = PrintQ.GetPrintCapabilities() 

    Dim CurrentTicket As SysPrint.PrintTicket = PrintQ.CurrentJobSettings.CurrentPrintTicket 
    If able.StaplingCapability IsNot Nothing AndAlso able.StaplingCapability.Count > 0 Then 
     If able.StaplingCapability.Contains(Printing.Stapling.StapleTopLeft) Then 
      CurrentTicket.Stapling = Printing.Stapling.StapleTopLeft 
     End If 
    Else 
     Debug.Print("no stapling capability") 
    End If 

    CurrentTicket.Duplexing = Printing.Duplexing.TwoSidedLongEdge 

    Dim fiName As String = "S:\Temp\PS\XPS\Test.xps" 

    Dim TestJob As SysPrint.PrintSystemJobInfo _ 
      = PrintQ.AddJob("Test job", fiName, False)