Frage

Aktualisieren!

Bindungsarbeiten. Das Problem ist, dass der XPSDocumentWriter die erste Seite des ersten Dokuments einer festen Dokumentsequenz nicht ordnungsgemäß schreibt. Dies scheint ein Thema zu sein, das von vielen Menschen angetroffen wird, die so etwas tun (dh fünf Entwickler weltweit). Die Lösung ist etwas seltsam. Ich füge es als Antwort ein.


Okay, es ist etwas subtiler als die Frage vorschlägt.

Ich habe eine Reihe von festen Pagen, jeweils hat der DataContext einzeln festgelegt. Jedes Festpage hat auch eine oder mehrere Kontrollen, die an den Kontext gebunden sind.

Wenn ich diese festen Pagen zu einem einzelnen FixedDocument hinzufüge und dieses einzelne FixedDocument in ein XPSDocument schreibe, werden meine Bindungen (sozusagen) abgeleitet und die korrekten Werte werden im XPSDocument dargestellt.

Wenn ich diese Festpage zu einzelnen FixedDocuments hinzufüge (jedes FP wird zu einer neuen FD hinzugefügt), werden diese FixedDocuments zu einer festen Dokumentsequenz hinzugefügt, und diese Sequenz wird dann in das XPSDocument geschrieben, meine Bindungen sind nicht entlarvt und meine Feststellungen erscheinen leer .

Debugging sagt mir, dass ich meine Bindungen oder meinen bindenden Kontext nicht verliere, also ist das nicht die Ursache für dieses Versagen.

Hier ist ein Beispielcode, um zu veranschaulichen, was los ist:

// This works
FixedPage fp = CreateFixedPageWithBinding();
fp.DataContext = CreateDataContext();
// Add my databound fixed page to a new fixed document
var fd = new FixedDocument();
var pc = new PageContent();
((IAddChild)pc).AddChild(fp);
fd.Pages.Add(pageContent);
// Create an xps document and write my fixed document to it
var p = Package.Open("c:\\output.xps", FileMode.CreateNew);
var doc = new XpsDocument(p);
var writer = XpsDocument.CreateXpsDocumentWriter(doc);
wri2.Write(fd);
p.Flush();
p.Close();

// This does NOT work
FixedPage fp = CreateFixedPageWithBinding();
fp.DataContext = CreateDataContext();
// Add my databound fixed page to a new fixed document
var fd = new FixedDocument();
var pc = new PageContent();
((IAddChild)pc).AddChild(fp);
fd.Pages.Add(pageContent);
// Create a fixed document sequence and add the fixed document to it
FixedDocumentSequence fds = CreateFixedDocumentSequence();
var dr = new DocumentReference();
dr.BeginInit();
dr.SetDocument(fd);
dr.EndInit();
(fds as IAddChild).AddChild(dr);
// Create an xps document and write the fixed document sequence to it
var p = Package.Open("c:\\output.xps", FileMode.CreateNew);
var doc = new XpsDocument(p);
var writer = XpsDocument.CreateXpsDocumentWriter(doc);
wri2.Write(fds);
p.Flush();
p.Close();

Sie können sehen, dass der einzige Unterschied zwischen den beiden darin besteht, dass ich das feste Dokument einer festen Dokumentsequenz hinzufüge, die dann geschrieben wird.

Unabhängig davon, was Magie passiert, die dazu führt, dass die Datenbank bewertet wird und die gebundenen Werte eingefügt werden, werden nicht stattfinden, wenn meine festen Dokumente nicht in das XPS -Dokument geschrieben werden. Ich muss in der Lage sein, mehr als ein festes Dokument zu schreiben, und die Schreibmethode kann nur einmal aufgerufen werden, sodass ich die festen Dokumente zu einer festen Dokumentsequenz hinzufüge, die ich dann schreibe. Aber ich Auch Brauchen Sie meine verdammte Datenbank, um auch zu arbeiten!

Jede Hilfe in dieser Situation wäre geschätzt. Ich weiß, dass es nicht gerade der häufigste Teil des Rahmens ist. Ich hoffe nur, dass jemand hier ein paar betriebliche Erfahrung damit hat (ich sehe Sie an und lauere MS -Mitarbeiter).

War es hilfreich?

Lösung

Die Ursache für diesen Fehler ist, dass das Layout der Festpage vor dem Schreiben nicht aktualisiert wird. Dies führt dazu, dass die erste Festpage im ersten festen Dokument in der FixedDocumentsequenz falsch geschrieben wird. Dies wirkt sich aus Keine anderen Seiten im resultierenden Dokument, Dies machte es schwieriger, diesen Fehler/die Kante zu nageln.

Die folgenden Werke (umgeschriebene Version des nicht arbeitenden Beispiels):

FixedPage fp = CreateFixedPageWithBinding();
fp.DataContext = CreateDataContext();
var fd = new FixedDocument();

/* PAY ATTENTION HERE */
// set the page size on our fixed document 
fd.DocumentPaginator.PageSize =
   new System.Windows.Size()
   {
       Width = DotsPerInch * PageWidth,
       Height = DotsPerInch * PageHeight
   };
// Update the layout of our FixedPage
var size = fd.DocumentPaginator.PageSize;
page.Measure(size);
page.Arrange(new Rect(new Point(), size));
page.UpdateLayout();    
/* STOP PAYING ATTENTION HERE */

var pc = new PageContent();
((IAddChild)pc).AddChild(fp);
fd.Pages.Add(pageContent);
// Create a fixed document sequence and add the fixed document to it
FixedDocumentSequence fds = CreateFixedDocumentSequence();
var dr = new DocumentReference();
dr.BeginInit();
dr.SetDocument(fd);
dr.EndInit();
(fds as IAddChild).AddChild(dr);
// Create an xps document and write the fixed document sequence to it
var p = Package.Open("c:\\output.xps", FileMode.CreateNew);
var doc = new XpsDocument(p);
var writer = XpsDocument.CreateXpsDocumentWriter(doc);
wri2.Write(fds);
p.Flush();
p.Close();

Andere Tipps

Ich habe dieses Problem gefunden, während ich versuchte zu verwenden XpsDocumentWriter an a schreiben PrintQueue. Der folgende Code druckt die erste Seite korrekt.

//Prints correctly
FixedDocumentSequence Documents = new FixedDocumentSequence();

//some code to add DocumentReferences to FixedDocumentSequence

PrintDialog printDialog = new PrintDialog
{
    PrintQueue = LocalPrintServer.GetDefaultPrintQueue() 
};
printDialog.PrintTicket = printDialog.PrintQueue.DefaultPrintTicket;
if (printDialog.ShowDialog() == true)
{
    Documents.PrintTicket = printDialog.PrintTicket;

    XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(printDialog.PrintQueue);
    writer.Write(Documents, printDialog.PrintTicket);
    printerName = printDialog.PrintQueue.FullName;
}

Wenn Sie das entfernen printDialog.ShowDialog() Und versuchen Sie einfach, den Standarddrucker zu stillen, die erste Seite druckt falsch. In meinem Szenario musste ich jedoch keine verwenden FixedDocumentSequence Also habe ich es nur für eine Single ausgetauscht FixedDocument Und stiller Druck funktionierte. Ich habe versucht, das Layout auf dem zu aktualisieren FixedPage ohne Erfolg. Seltsam, wie die erste Seite einwandfrei gedruckt wird, wenn ich den Dialogfeld "Druck" anschreibe.

Ein Grund, warum Sie eine Bindung verlieren, ist, dass Sie irgendwo eine Ausnahme machen - leider wird diese Ausnahme leise verschluckt und Ihre Bindung hört nur auf zu arbeiten. Schalten Sie Ausnahmen der ersten Chance ein und sehen Sie, ob etwas getroffen wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top