7
votes

Images manquantes dans le flowdocument enregistré comme document XPS

J'ai des difficultés à obtenir des images contenues dans un flowdocument à montrer lorsque le flowdocument est enregistré en tant que document XPS.

Voici ce que je fais: p>

  1. Créez une image à l'aide du Image contrôle du WPF. J'ai défini la source d'image entre crochets par des appels pour commencer / endiniter. Li>
  2. Ajoutez l'image à la flowdocument en l'enveloppant dans un Blockuicontainer . Li>
  3. Enregistrer l'objet Flowdocument à un fichier XPS à l'aide d'une version modifiée de Ce code . Li> ol>

    Si j'affiche ensuite le fichier enregistré dans la visualiseur XPS, l'image n'est pas affichée. Le problème est que les images ne sont pas chargées jusqu'à ce que sur l'écran par WPF ne soit pas enregistrée dans le fichier XPS. Par conséquent, il existe une solution de contournement: si je montrais d'abord le document à l'écran à l'aide de FlowdocumentPageViewer Enregistrez ensuite le fichier XPS, l'image est chargée et apparaît dans le fichier XPS. Cela fonctionne même si le flowdocumentPageViewer est caché. Mais cela me donne un autre défi. Voici ce que je souhaite faire (en pseudocode): P>

    void SaveDocument()
    {
        AddFlowDocumentToFlowDocumentPageViewer();
        SaveFlowDocumentToXpsFile();
    }
    


3 commentaires

Avez-vous trouvé un moyen de montrer le flowdocument dans un spectateur avant d'imprimer? Je envisage un "hack" similaire pour que mon document rendit correctement.


@ Dennisroche: Non, malheureusement, je n'ai jamais trouvé de meilleure solution que de montrer brièvement le document à l'écran avant de l'enregistrer dans un fichier. S'il vous plaît laissez-moi savoir si vous trouvez une meilleure solution.


Je peux avoir une solution possible qui utilise le contextuallayoutAmanager pour marcher à l'arbre logique. Je vous ferai savoir si cela fonctionne, je vous ferai savoir. Sinon, je vais recourir à la chargement du document dans un spectateur comme vous l'avez fait, cependant définira la fenêtre sur X: 10 000 y: 10 000 de sorte que l'utilisateur ne le voit pas.


4 Réponses :


1
votes

Couple choses ... Vous êtes sûr que l'image est dimensionnée avant son écrit? Habituellement, vous devez appeler la mesure sur le contrôle de manière à ce qu'elle puisse se former en conséquence (Infinity permet au contrôle de se développer à sa largeur et à sa hauteur) xxx

aussi, parfois, vous devez parfois heurter le fil de l'interface utilisateur. que tout se met à jour dans le contrôle xxx


6 commentaires

L'utilisation de ce truc Dispatcher fonctionne effectivement pour de petites images ou des images déjà mises en cache, mais pas pour les grandes images qui téléchargent sur Internet en arrière-plan. Toute idée de déterminer la tentative de sauvegarde sur XPS jusqu'à ce que le téléchargement de 1-2 secondes soit terminé? Ou mieux, attendez que toutes les images que le flowdocument puissent contenir sont entièrement téléchargées et rendues?


@Bca tu pourrais essayer DispatcherPriority.idle?


Oui, j'ai utilisé dispatcherpriority.systemidle . Je suppose que le tour du répartiteur ne fonctionne pas si l'image est téléchargée en arrière-plan?


@Bca sonne comme ça. Vous devrez suivre combien d'images téléchargent et continuent ensuite après leur terminer.


Ce que je voudrais faire, c'est d'une manière ou d'une autre) attendre le téléchargement de chaque image (si ce n'est pas déjà dans le cache d'image WPF) à l'aide d'attendre / async, et 2) Placez l'image téléchargée dans le cache , puis 3) chargez mon flowdocument. En théorie, si toutes les images sont déjà dans le cache, cela ne fonctionnera aucun problème. Avez-vous une idée de comment accomplir les n ° 1 et 2?


@Bca Nope. Cela ressemble à une bonne question à poser. Vous vous demandez comment savoir quand Imagesource a terminé le téléchargement? Vous pouvez le jeter dans un bitmapimage et regarder l'événement téléchargé Télécharger. Cela pourrait nécessiter beaucoup de piratage méchant pour obtenir chacun. Ajoutez peut-être un tivaloConverter personnalisé qui convertit une URL en bitmapimage, ce sont une trace de tous et expose un événement statique pour indiquer que tous les téléchargements sont terminés? Sentir ce parfum de piratage frais. Sent le fumier. Mmmm.



3
votes

La solution éventuelle était la même que celle de votre arrivée, qui consiste à mettre le document dans un spectateur et à le montrer brièvement à l'écran. Vous trouverez ci-dessous la méthode de l'assistance que j'ai écrite pour le faire pour moi. xxx

EDIT: Je viens d'ajouter fenêtre.showintaskbar = false à la méthode comme si vous étiez rapide, vous pouviez voir que la fenêtre apparaît la barre des tâches.

L'utilisateur ne "voir" ne "voir" ne "voir" ne "voir" jamais la fenêtre, car elle est positionnée de manière désactivée à l'écran int32.maxvalue - une astuce qui était courante dans la journée avec tôt Création multimédia (par exemple, Macromedia / Adobe Directrice).

Pour les personnes qui recherchent et trouvent cette question, je peux vous dire que Il n'y a pas d'autre moyen de forcer le document à rendre.

hth,


2 commentaires

Merci pour votre réponse. J'ai marqué votre réponse comme la réponse acceptée, même si j'aurais aimé voir une solution différente ;-).


J'aurais aimé une meilleure solution, mais je crois que j'ai épuisé toutes les autres possibilités. C'est une solution de contournement plutôt propre que l'utilisateur jamais voir la fenêtre apparaissant comme parti hors écran hors écran.



0
votes

Vous n'avez pas à afficher le document pour avoir des images enregistrées dans les XPs. Appelez-vous commettez-vous sur le XPSSerializationManager? xxx


4 commentaires

J'ai essayé d'appeler xpsserializationmanager.commit mais il n'a pas eu l'effet désiré.


Désolé de ne pas répondre plus tôt. Voici une vraie version sale qui devrait fonctionner. Tiens-moi au courant de ce que ça devient


Je n'ai pas eu la chance de l'essayer. Je reviendrai vers toi :-)


Avez-vous eu la chance d'essayer cela?



0
votes

J'ai pu résoudre ce problème en jetant le flowdocument dans un spectateur, puis effectuez une mesure / arrangez.

FlowDocumentScrollViewer flowDocumentScrollViewer = new FlowDocumentScrollViewer();
flowDocumentScrollViewer.Document = flowDocument;
flowDocumentScrollViewer.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
flowDocumentScrollViewer.Arrange(new Rect(new Point(0, 0), new Point(Double.MaxValue, Double.MaxValue)));


0 commentaires