Frage
BlockUIContainer
? Hintergrund
Ich habe eine generierte FlowDocument
mit Textabsätzen mit ein paar Rectangle
Elementen gefüllt DrawingBrushes
aus einem Ressourcenwörterbuch und BlockUIContainer
mit benutzerdefinierten Steuerelementen.
Das Dokument wird korrekt dargestellt, wenn es in einem der FlowDocument * -Steuerelemente HOWEVER angezeigt wird, wenn das Dokument in ein FixedDocument / XpsDocument konvertiert wird, wobei keines der Elemente Rectangle
oder BlockUIContainer
rendert.
Ich bin mir fast sicher, dass es daran liegt, dass die Kontrolle nicht gemessen / arrangiert wurde , kann aber nicht herausfinden, wie man das erzwingen kann, bevor es in das XpsDocument konvertiert wird.
Ich habe die LogicalTree
rekursiv ausgeführt und folgendes getan,
wobei d
ein DependencyObject
ist. Ich kann sehen, dass dies die Eigenschaften ActualWidth
und ActualHeight
festlegt, wenn im Debugger auf eine Stelle verwiesen wird.
Ich habe versucht, das Dispatcher
so zu rendern, wie es von Will ♦ vorgeschlagen wird.
Code zum Drucken des XpsDocuments
%Vor% Wie Sie sehen können, verwende ich auch eine benutzerdefinierte DocumentPaginator
namens 'FixedDocumentPaginator'; Allerdings werde ich diesen Code nicht posten, da ich bezweifle, dass das Problem da ist, wenn das Dokument in GetPage(int pageNumber)
paginiert wird. Alles wurde bereits in Visual
konvertiert und es ist zu spät für das Layout.
Bearbeiten
Hmm. Als ich dies eingegeben habe, ist mir gerade ein Gedanke gekommen, dass das geklonte Dokument möglicherweise noch kein Measure/Arrange/UpdateLayout
hat.
Frage: Wie kann ich ein Measure / Update / Arrangement für ein FlowDocument erzwingen?
Ein möglicher Hack, den ich bearbeiten könnte, wäre, das geklonte Dokument in einem der FlowDocumentViewers (vielleicht außerhalb des Bildschirms) zu zeigen.
Eine andere mögliche Lösung, von der ich gerade erfahren habe und die ich nicht probiert habe, wäre: ContextLayoutManager.From(Dispatcher.CurrentDispatcher).UpdateLayout();
ContextLayoutManager
durchläuft den logischen Baum für Sie und aktualisiert das Layout.
Code zum Klonen des Dokuments
%Vor%Veröffentlichen Sie dies als zukünftige Referenz für andere, die ähnliche Renderprobleme mit FlowDocument / FixedDocument / XpsDocument haben.
Ein paar Dinge zu beachten:
BlockUIContainers
werden nicht geklont, wenn Sie die obige Methode verwenden. Dies war nicht sofort offensichtlich, bis ich den logischen Baum aus dem Debug-Fenster mit einigen Hilfsmethoden gedruckt habe (diese Methoden sind unten veröffentlicht - sie sind unglaublich nützlich). ForceRenderFlowDocument
%Vor% Bearbeiten: Ich habe gerade window.ShowInTaskbar = false
zur Methode hinzugefügt, als ob Sie schnell das Fenster in der Taskleiste sehen könnten.
Der Benutzer wird das Fenster nie "sehen", da es bei Int32.MaxValue
weit außerhalb des Bildschirms positioniert ist - ein Trick, der früher mit dem frühen Multimedia-Authoring (z. B. Macromedia / Adobe Director) üblich war.
Für Leute, die diese Frage suchen und finden, kann ich Ihnen sagen, dass es keine andere Möglichkeit gibt , um das Rendern des Dokuments zu erzwingen.
Visual und Logical Tree Helpers
%Vor%Verwendung
%Vor%Ich fand diese Lösung hier , und es hat mir geholfen, das Drucken des FlowDocment zu bekommen, ohne es vom Bildschirm rendern zu müssen ... Also ich hoffe es kann dir helfen !!
%Vor%Tags und Links wpf c# flowdocument printing xpsdocument