1

私は WPF フォームを持っています。印刷する必要があります。DocumentViewer を使用して印刷します。しかし、印刷またはプレビューしたい場合、複数のページがあるのに最初のページしか表示されません

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;
}
4

1 に答える 1

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);スタックオーバーフローを引き起こすという問題がありました。

私は現在使用しています。

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

どちらを使用しても、要素のサイズを変更する問題になります。これが私が探しているものです。

レンダリング パスを試してみましたが、私の状況ではコピー/複製された要素を使用することが指摘されました。これを書いている間、一部は機能しましたが、黒い画像が表示されましたが、チャートをスケーリングしようとしていることに注意してください。

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

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

レイアウト パスを試しましたが、取得できませんでした。

私は自分で作業を続けるつもりであり、私が見つけた新しいものを投稿します. 答えが見つかったら、同じことをしてください。

編集- これが私がやったことです。私の問題と解決策

于 2012-11-01T15:50:15.347 に答える