PrintPreview с использованием Xps и Xps.Packaging - вывод неправильного размера страницы - PullRequest
0 голосов
/ 07 марта 2019

У меня проблема с размером бумаги в диалоговом окне предварительного просмотра.Это должно быть A4, но он продолжает отображать мой PrintPreview как Размер письма.Я использую DocumentPaginator класс, как базу для многостраничного вывода.PageCount является правильным.Я нашел это решение, но для меня оно не работает, конечный эффект все тот же.Извините, за длинный код, но я понятия не имею, где может быть ошибка / упущение.Любые идеи, которые высоко ценятся

private void BtnPrint_Click(object sender, RoutedEventArgs e)
        {
            PrintDialog dialog = new PrintDialog();
            PageMediaSize pageSize = new PageMediaSize(PageMediaSizeName.ISOA4);
            dialog.PrintTicket.PageMediaSize = pageSize;

            var paginator = new RowPaginator(SomeData)
            { PageSize = new Size(dialog.PrintableAreaWidth, dialog.PrintableAreaHeight) };

            using (XpsDocument xpsDocument = new XpsDocument(someFileName, FileAccess.ReadWrite))
            {
                XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(xpsDocument);
                writer.Write(paginator);

                PrintPreview previewWindow = new PrintPreview
                {
                    Owner = this,
                    Document = xpsDocument.GetFixedDocumentSequence()
                };
                previewWindow.ShowDialog();
            }
        }

Производный документ Paginator class:

public class RowPaginator : DocumentPaginator
    {
        Data data;
        public RowPaginator(Data data)
        {
            this.data = data;
        }

        public override DocumentPage GetPage(int pageNumber)
        {
            var page = new PageElementRenderer(pageNumber, this.data)
            {
                Width = PageSize.Width,
                Height = PageSize.Height,
            };
            page.Measure(PageSize);
            page.Arrange(new Rect(new Point(0, 0), PageSize));
            page.UpdateLayout();

            return new DocumentPage(page);
        }
        public override bool IsPageCountValid { get { return true; } }
        public override int PageCount { get { return someInteger; } }
        public override Size PageSize
        {
            get { return this.pageSize; }
            set { this.pageSize = value; }
        }
        public override IDocumentPaginatorSource Source { get { return null; } }
    }

Простое окно PrintPreview:

public partial class PrintPreview : Window
    {
        public PrintPreview()
        {
            InitializeComponent();
        }

        public IDocumentPaginatorSource Document
        {
            get { return viewer.Document; }
            set { viewer.Document = value; }
        }
    }
...