Печать нескольких страниц элементов управления xaml

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

Я проверил общую высоту всех элементов управления xaml, разделенную на высоту страницы, и установил это число, поэтому я знаю, сколько страниц мне нужно напечатать.

Затем я создаю список FrameworkElements для каждой страницы (см. логику ниже) и сохраняю каждый список (каждый обозначает одну страницу) в массиве.

В конце я хочу создать предварительный просмотр, который содержит каждую страницу и позволяет пользователю распечатать все страницы. Для этого мне нужно объединить страницы в документ, но я не знаю, как это сделать. Пожалуйста, взгляните на мой код:

Package package = Package.Open("test.xps", FileMode.Create);

        // Create new xps document based on the package opened

        XpsDocument doc = new XpsDocument(package);

        // Create an instance of XpsDocumentWriter for the document

        XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(doc);

        // Write the canvas (as Visual) to the document

        double height = element.ActualHeight;
        double width = element.ActualWidth;
        System.Windows.Controls.PrintDialog printDlg = new System.Windows.Controls.PrintDialog();
        Size pageSize = new Size(printDlg.PrintableAreaWidth, printDlg.PrintableAreaHeight);
        int pageCount = (int)Math.Ceiling(height / pageSize.Height);


        if (pageSize.Height < height) {
            var grid = element as Grid;
            var children = grid.Children;
            List<FrameworkElement>[] pages = new List<FrameworkElement>[pageCount-1];
            int i = 0;
            double currentHeight = 0;

            foreach (FrameworkElement c in children) {


                currentHeight += c.RenderSize.Height;


                if (currentHeight < pageSize.Height) {

                    pages[i] = new List<FrameworkElement>();
                    pages[i].Add(c);
                }
                else {
                    i++;
                    currentHeight = 0;
                    pages[i] = new List<FrameworkElement>();
                    pages[i].Add(c);
                }
            }
            for (int j = 0; j < pageCount; j++) {
                var collator = writer.CreateVisualsCollator();
                collator.BeginBatchWrite();
                foreach (FrameworkElement c in pages[j]) {


                    collator.Write(c);


                }
                collator.EndBatchWrite();
            }
        }


        doc.Close();

        package.Close();

        string filename = @"C:\Users\rzimmermann\Documents\Visual Studio 2012\Projects\MvvmLightPrintFunction\MvvmLightPrintFunction\bin\Debug\test.xps";

        DocumentViewer viewer = new DocumentViewer();

        doc = new XpsDocument(filename, FileAccess.Read);

        viewer.Document = doc.GetFixedDocumentSequence();

        Window ShowWindow = new Window();

        ShowWindow.Width = 400;

        ShowWindow.Height = 300;

        ShowWindow.Content = viewer;

        ShowWindow.Show();

person user3292642    schedule 22.04.2014    source источник
comment
Прошло слишком много времени с тех пор, как я это сделал, но, насколько я помню, создайте FixedPage msdn.microsoft.com/en-us/library/ для каждой страницы.   -  person kenny    schedule 22.04.2014


Ответы (2)


@kenny прав, вам нужно использовать FixedPages. Отличный учебник см. по адресу: http://www.nbdtech.com/Blog/archive/2009/04/20/wpf-printing-part-2-the-fixed-document.aspx

Что касается добавления страниц в документ, вы можете сделать это так:

doc.Pages.Add(page1Content);
doc.Pages.Add(page2Content);

// и т. д.

person Jarod Kientz    schedule 22.04.2014

 ... PrintDialog dialog = new PrintDialog();

        //dialog.PrintVisual(this.scrollCheckCardinfo, "");
        Nullable<Boolean> print = dialog.ShowDialog();
        if (print == true)
        {
            Grid DynamicGrid = new Grid();
            DynamicGrid.Margin = new Thickness(100, 50, 0, 0);
            RowDefinition gridRow1 = new RowDefinition();
            gridRow1.Height = new GridLength(45);
            RowDefinition gridRow2 = new RowDefinition();
            DynamicGrid.RowDefinitions.Add(gridRow1);
            DynamicGrid.RowDefinitions.Add(gridRow2);
            TextBlock txtBlock1 = new TextBlock();
            txtBlock1.Text = "Printed by xyz " + DateTime.Now.ToString();
            txtBlock1.FontSize = 14;
            txtBlock1.FontWeight = FontWeights.Bold;
            txtBlock1.VerticalAlignment = VerticalAlignment.Top;

            Grid.SetRow(txtBlock1, 0);
            Grid.SetRow(this.scrollCheckCardinfo, 1);
            DynamicGrid.Children.Add(txtBlock1);
            DynamicGrid.Children.Add(CloneXaml(this.scrollCheckCardinfo));
            dialog.PrintVisual(DynamicGrid, "xyz");

        }...
     public static T CloneXaml<T>(T source)
    {
        string xaml = XamlWriter.Save(source);
        StringReader sr = new StringReader(xaml);
        XmlReader xr = XmlReader.Create(sr);
        return (T)XamlReader.Load(xr);
    }

this.scrollCheckCardinfo — это сетка.

person huse.ckr    schedule 12.09.2019