WPF Impression pour ajuster la page
j'ai recherché les options de comment imprimer des contrôles WPF et a trouvé des solutions. J'ai besoin pour l'adapter à mes imprimés de contrôle de l'impression de la page tout en préservant l'aspect ratio (mon contrôle est carré; grille de sudoku).
J'ai trouvé une solution qui redimensionne et repositionne de contrôle pour s'adapter à une page. Qui fonctionne bien, mais il a également repositionne que le contrôle sur ma fenêtre.
voici le code que j'utilise pour l'impression et la mise à l'échelle :
//get selected printer capabilities
System.Printing.PrintCapabilities capabilities = dialog.PrintQueue.GetPrintCapabilities(dialog.PrintTicket);
//get scale of the print wrt to screen of WPF visual
double scale = Math.Min(capabilities.PageImageableArea.ExtentWidth / mrizka.ActualWidth, capabilities.PageImageableArea.ExtentHeight / mrizka.ActualHeight);
//Transform the Visual to scale
mrizka.LayoutTransform = new ScaleTransform(scale, scale);
//get the size of the printer page
Size sz = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);
//update the layout of the visual to the printer page size.
mrizka.Measure(sz);
mrizka.Arrange(new Rect(new Point(capabilities.PageImageableArea.OriginWidth, capabilities.PageImageableArea.OriginHeight), sz));
dialog.PrintVisual(mrizka, mrizka.getID().ToString());
J'ai essayé deux aproaches pour résoudre ce problème:
-
Clone de mon contrôle, et de transformer cloné un, unaffecting d'origine.
Ne fonctionne pas, pour une raison que j'ai fini à l'exception Du DependencyObject n'est pas un contexte pour cette Gelé, mais curieusement, dans certains cas seulement. -
Revenir de taille et les changements de position. J'ai essayé d'appeler InvalidateArrange() méthode qui semble fonctionner, mais seulement lors du premier appel de la méthode d'impression. Lors du deuxième appel, il n'a pas fonctionné.
Que dois-je faire s'il vous plaît, toutes les idées< je vous remercie.
Vous devez vous connecter pour publier un commentaire.
Je sais que cette question est assez ancien mais à la recherche d'une solution à ce problème moi-même. Voici la solution que j'utilise actuellement. - Je conserver l'original de transformation en fonction du cadre de l'élément et le réappliquer après l'impression est terminée.
C'était une réponse à la question qui a été posée par user1018711. Côté d'une impression sur une imprimante de la page à l'aide de C# et WPF. Lorsque vous souhaitez imprimer un visuel, qui pourrait être un contrôle de ce qui peut y compris un grand nombre de contrôles (par exemple, Bouton, DataGrid, TextBlock, Label ,etc). Ici je veux imprimer une grille de données nommée song2Drid à l'imprimante, mais son contenu était plus grande que la taille de page de l'imprimante (sa largeur est plus large que la largeur du papier) de sorte qu'il a été tronqué. Je ne pouvais pas tous les voir, donc j'ai eu à l'échelle du visuel, mais je voulais garder le ratio tout comme le même que l'ancien.
J'ai aussi mis du papier marges à 0,75 pouces de chaque côté du papier, gauche, haut, droite et bas. J'ai aussi centralisé que le contenu visuel (song2Grid) sur le papier. J'ai donc pu voir le contenu imprimé seulement sur le centre de la feuille. Mais si le visuel était une fenêtre de l'Application.Actuel.MainWindow ou de n'importe quelle fenêtre créée par programme une nouvelle Fenêtre(), alors Il ne sera pas mis à l'échelle. cela signifiait cette méthode ne marchera pas pour un objet de la Fenêtre.
Aussi, Si vous souhaitez récupérer le regard original sur l'écran du changement de l'un par mise à l'échelle à l'impression, alors vous devez avoir les états suivants
gagner.LayoutTransform = oldLayoutTransform; gagner.Mesure(oldSize); win.Organiser(nouveau Rect(new Point(0,0),oldSize));