2010-02-03 23 views
15

Quando ho letto libri su WPF, ho visto gli autori menzionare XPS come se fosse qualcosa di importante. Windows include anche il suo visualizzatore XPS e l'ho visto elencato come una "funzionalità" di Windows.Qual è il punto di XPS?

Ma perché? Qual e il punto? Chi diavolo lo usa? Ho capito che XPS è, in pratica, come PDF, xhtml o ePub (che è solo xhtml) ... o anche il formato di Word di Word. Molte delle funzionalità sono le stesse tra quei formati.

Non sembra avere grandi vantaggi rispetto a nessuno di questi altri formati. Mi sembra che xhtml sia molto più utile di XPS come metodo per salvare e caricare FlowDocuments da RichTextBox. Ho esaminato più blog sulla conversione tra i due. La maggior parte o tutto il ricco testo su internet è (x) html. Oltre a questo, non penso che nessuno lo usi solo per pubblicare i loro documenti; Il PDF è preferito Sembra che l'XPS sia solo un formato casuale creato da MS e deciso a spingere. Generalmente amo la SM, ma hanno l'abitudine a questo genere di cose. Non è possibile che MS abbia creato un'API usando xhtml? Sarebbe stato più utile in molte situazioni, penserei.

Quindi, c'è un motivo per utilizzare XPS, in particolare rispetto a uno degli altri formati che ho citato (o altri che non ho)? Hai mai usato XPS nei tuoi programmi o in altro modo?

risposta

8

Come già affermato da U62, WPF viene fornito con un controllo DocumentViewer che consente di visualizzare i documenti XPS. Il DocumentViewer ha anche alcune funzioni utili come Stampa, Zoom, FitToPage, ecc. Quindi non è necessario implementarlo o utilizzare uno strumento di terze parti.

Quello che ho appena finito un'ora fa usando XPS e il DocumentViewer era una sorta di "Anteprima di stampa etichetta di indirizzo". Consentire all'utente di selezionare alcuni contatti da un elenco di contatti, fare clic su "Anteprima di stampa". Si apre una nuova finestra XAML che contiene un controllo DocumentViewer e un ListBox con la scelta di diverse etichette (ad es. 1 foglio con 12 etichette [2 colonne, 6 righe], 1 foglio con una singola etichetta di cui larghezza e altezza possono essere definite dall'utente) . In base alla selezione degli utenti, viene generato un documento XPS nel layout selezionato dall'utente con gli indirizzi dei contatti selezionati. Se ad es. l'utente ha selezionato 4 contatti e desidera stamparli su "SingleLabelSheet", generi 1 documento XPS con 4 pagine, ciascuna pagina contenente 1 indirizzo. Quindi visualizzo l'XPS nel DocumentViewer e l'utente può stampare le etichette sulla nostra stampante per etichette.

Una volta compreso il funzionamento dell'API XPS (almeno le Nozioni di base), è stato questione di 2 ore per farlo funzionare correttamente.

Quindi, in sostanza, vedo XPS come un'API facile da usare per visualizzare FixedDocuments che devono essere generati al volo. Ma non vorrei personalmente salvarli sul mio HDD o in qualche modo modificarli o qualunque cosa tu faccia di solito con i documenti.

3

L'unico vantaggio effettivo che posso pensare è che si dispone di un controllo per la visualizzazione di documenti XPS nelle applicazioni WPF. Gli altri formati che hai citato significano che dovresti inserire un renderer di terze parti (o scriverne uno tu stesso se hai un anno di ricambio).

btw. Non so molto di ePub, ma XPS non è direttamente confrontabile con XHTML, è più simile al PDF in quanto è progettato per avere un layout fisso.

3

Da XPS a WPF è come WMF a Win32/WinForms, è un formato persistente che consente di archiviare e stampare la grafica WPF nativa.

XPS viene utilizzato per stampare da WPF (anche quando si stampa direttamente dall'applicazione senza salvare, il sistema di stampa interno è costruito su XPS) sì, quali dovrebbero MS fare:

  1. Creare un nuovo formato di file che esattamente in sintonia con quello che stanno cercando di fare
  2. Costruire un traduttore perfetto al 100% da WPF in un formato che non controlla come PDF (e sperare che Adobe non infranga tutte le applicazioni WPF là fuori con la prossima versione di Acrobat Reader).

Cosa vorresti fare?

Il salvataggio di file XPS è solo un bel bonus.

+0

Vorrei provare a farlo funzionare con le cose comuni esistenti che le persone effettivamente utilizzano. –

+0

Probabilmente si dovrebbe menzionare che XPS non è limitato solo a WPF, ma può essere indirettamente utilizzato anche con Win32 o WinForms. I sistemi Windows XP e successivi installano una stampante XPS di default che può essere utilizzata per generare documenti XPS. – stakx

3

Guarda, potrei essere un pessimista su XPS come una soluzione di generazione di report, ma ho dato un risultato e ho trovato la documentazione iniziale difficile da capire, con meno campioni del mondo reale là fuori di quello che avrei voluto. Quando l'ho inserito in un'applicazione di business reale mi sono trovato frustrante, in particolare nelle app LOB che richiedono tabelle che si estendono su più pagine.

cose possono essere cambiate da allora, ma non appena ho iniziato a guardare le tabelle che si estendeva su più pagine e volevo intestazioni delle colonne per andare in cima, ecc ho trovato che l'API mi ha richiesto di fare quello che chiamerei soluzioni alternative eccessive con complessità non necessaria.

Quindi, le cose potrebbero essere cambiate da allora (circa 8 mesi fa), ma sono passato da XPS a ITextSharp e questo è stato molto meno doloroso.

Quindi, l'unico vantaggio che vorrei dire, come tutti gli altri, è il visualizzatore incorporato in WPF, ma a parte questo ritengo che l'API potrebbe aver bisogno di "maturare" un po 'di più prima di tentare nuovamente qualcosa in esso.

1

In realtà ho trovato un motivo molto valido per utilizzare XPS. Volevo stampare da più fonti, merge documents e specificare duplex e pinzatura. Infine dovrebbe essere stampato come un unico documento con duplex e pinzatura. Stavo attraversando un momento difficile, ma ho scoperto che stampando su XPS (salvato su disco) riuscivo a raggiungere il mio obiettivo con il minimo sforzo. Non ho trovato nessun altro metodo così semplice e diretto.

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)