Drucken von BlockUIContainer zu XpsDocument / FixedDocument

8

Frage

  1. Wie drucken Sie ein FlowDocument mit BlockUIContainer ?
  2. Wie kann ich ein Measure / Update / Arrangement für ein FlowDocument erzwingen?

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,

    %Vor%

    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%     
Dennis 25.02.2012, 19:33
quelle

2 Antworten

9

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).
  • Sie müssen das Dokument in einem Viewer anzeigen und kurz auf dem Bildschirm anzeigen. Unten ist die Hilfsmethode, die ich für mich geschrieben habe.

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%     
Dennis 27.02.2012, 11:47
quelle
5

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%     
quelle