2012-10-30 5 views
1

У меня есть форма WPF, мне нужно его распечатать, я использую DocumentViewer для печати. но когда я хочу, чтобы распечатать его или Preview, я вижу только первую страницу в то время как у меня есть более чем одна страницаПредварительный просмотр печати и печать в wpf

private void Print(object sender, RoutedEventArgs e) 
{ 
PrintSettings printSettings = PrintSettings.Default; 
UIElement container = this.Content as UIElement; 
ScrollViewer containerPanel = Helper.FindVisualChildren<ScrollViewer>(container).FirstOrDefault(); 
var origParentDirection = containerPanel.FlowDirection; 
var origDirection = (containerPanel.Content as FrameworkElement).FlowDirection; 
if (containerPanel != null && containerPanel.FlowDirection == FlowDirection.RightToLeft) 
{ 
containerPanel.FlowDirection = FlowDirection.LeftToRight; 
(containerPanel.Content as FrameworkElement).FlowDirection = FlowDirection.RightToLeft; 
} 
var window = new Window(); 
string tempFileName = System.IO.Path.GetTempFileName(); 
System.IO.File.Delete(tempFileName); 
using (XpsDocument xpsDocument = new XpsDocument(tempFileName, FileAccess.ReadWrite, System.IO.Packaging.CompressionOption.Fast)) 
{ 
XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(xpsDocument); 
(containerPanel.Content as FrameworkElement).Margin = new Thickness(20); 
writer.Write((containerPanel.Content as FrameworkElement), printSettings.PrintTicket); 
var doc = xpsDocument.GetFixedDocumentSequence(); 
doc.PrintTicket = printSettings.PrintTicket;  
window.FlowDirection = System.Windows.FlowDirection.RightToLeft; 
window.Content = new DocumentViewer { Document = doc }; 
window.Margin = new Thickness(10); 
window.ShowDialog(); 
} 
(containerPanel.Content as FrameworkElement).FlowDirection = origDirection; 
containerPanel.FlowDirection = origParentDirection; 
} 

ответ

0

user1780436, я в настоящее время ищет аналогичный ответ. Вы пытаетесь напечатать панель, правильно?

Я нахожу, что масштабирование элемента является самой большой проблемой. Это вызывает еще одну проблему с масштабированием того, что вы хотите распечатать, а не с фактическим видимым элементом. Вам нужно будет скопировать элемент в новый элемент.

public class Copy<T> 
{ 
    public static T DeepCopy<T>(T element) 
    { 
     string xaml = XamlWriter.Save(element); 
     StringReader xamlString = new StringReader(xaml); 
     XmlTextReader xmlTextReader = new XmlTextReader(xamlString); 
     var DeepCopyobject = (T)XamlReader.Load(xmlTextReader); 
     return DeepCopyobject; 
    } 

} 

или

myNewElement = XamlReader.Parse(XamlWriter.Save(myOldElement.DataContext)) as ElementType 

Я нашел этот ответ несколько раз на нескольких сайтах, чтобы копировать/клонировать элемент, но у меня были проблемы с string xaml = XamlWriter.Save(element); вызывающих stackoverflows.

Я сейчас использую.

myNewElement = new ElementType() { DataContext = myOldElement.DataContext } 

Любой, кого вы используете, становится проблемой изменения размера элемента. Это то, что я ищу.

Я пробовал rendering pass, но это только что указывало, что в моей ситуации использовать скопированный/клонированный элемент. Хотя во время написания этого я получил некоторые из них, чтобы работать, но дает мне черное изображение, обратите внимание, что я пытаюсь масштабировать диаграмму.

myNewElement.Width = newWidth; 
myNewElement.Height = newHeight; 

myNewElement.Measure(new System.Windows.Size(newWidth, newHeight)); 
myNewElement.Arrange(new Rect(0, 0, newWidth, newHeight)); 

Я попробовал layout pass, и не получить его.

Я собираюсь продолжать работать над собой, и я опубликую что-нибудь новое, что я нахожу. Пожалуйста, сделайте то же самое, если найдете ответ.

Редактировать - Вот что я сделал. My problem and solution

Смежные вопросы