none
wpf grid печать RRS feed

  • Вопрос

  • Добрый день!

    Есть проект WPF, MVVM Light.

    Динамически создаю компонент Grid

    Grid grid = new Grid();
    
    //......
    //наполнение контентом
    //......

    Делаю печать 

    PrintDialog printDialog = new PrintDialog();
    if (printDialog.ShowDialog().GetValueOrDefault() == true)
    {
       Size pageSize = new Size(printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight);
       grid.Measure(pageSize);
       grid.Arrange(new Rect(0, 0, pageSize.Width, pageSize.Height));
       printDialog.PrintVisual(grid, "print");
    }

    Происходит печать, но только первой страницы.  Таблица обрезается.

    Как запустить печать всех страниц?


    • Изменено ilya83 8 декабря 2017 г. 12:09
    8 декабря 2017 г. 12:09

Ответы

  • Проблема решена. 

    Оказалось надо было вместо grid использовать table

    PrintDialog printDialog = new PrintDialog();
    
    if (printDialog.ShowDialog() == true)
                {
                    FlowDocument flowDocument = new FlowDocument();
                    flowDocument.ColumnWidth = printDialog.PrintableAreaWidth;
                    flowDocument.PageHeight = printDialog.PrintableAreaHeight;
                    flowDocument.PageWidth = printDialog.PrintableAreaWidth;
                    flowDocument.PagePadding = new Thickness(40, 50, 40, 50);
    
                    Table table = new Table();
                    flowDocument.Blocks.Add(table);
    
                    //... заполнение table ...
     
                      printDialog.PrintDocument(((IDocumentPaginatorSource)flowDocument).DocumentPaginator, "A Flow Document");
                 }
    

    • Помечено в качестве ответа ilya83 11 декабря 2017 г. 5:58
    11 декабря 2017 г. 5:58

Все ответы

  • Пробую еще таким образом:

    Grid grid = new Grid();            
    
    //...grid заполняю контентом...
    
    PrintDialog printDialog = new PrintDialog();
    if (printDialog.ShowDialog().GetValueOrDefault() == true)
    {
         Size pageSize = new Size(printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight);
         grid.Measure(pageSize);
         grid.Arrange(new Rect(0, 0, pageSize.Width, pageSize.Height));
    
        FlowDocument doc = new FlowDocument();
        doc.ColumnWidth = printDialog.PrintableAreaWidth;
        doc.PageHeight = printDialog.PrintableAreaHeight;
        doc.PageWidth = printDialog.PrintableAreaWidth;
        doc.PagePadding = new Thickness(40, 50, 40, 50);
    
        BlockUIContainer blockUIContainer = new BlockUIContainer();
        blockUIContainer.Padding = new Thickness(0);
        blockUIContainer.Child = grid;
        doc.Blocks.Add(blockUIContainer); 
     
     printDialog.PrintDocument(((IDocumentPaginatorSource)doc).DocumentPaginator, "print");
    }

    Также печатается только одна страница. 

    Мне кажется, я какие-то нужные свойства не выставляю объекту FlowDocument



    • Изменено ilya83 8 декабря 2017 г. 13:47
    8 декабря 2017 г. 13:44
  • Проблема решена. 

    Оказалось надо было вместо grid использовать table

    PrintDialog printDialog = new PrintDialog();
    
    if (printDialog.ShowDialog() == true)
                {
                    FlowDocument flowDocument = new FlowDocument();
                    flowDocument.ColumnWidth = printDialog.PrintableAreaWidth;
                    flowDocument.PageHeight = printDialog.PrintableAreaHeight;
                    flowDocument.PageWidth = printDialog.PrintableAreaWidth;
                    flowDocument.PagePadding = new Thickness(40, 50, 40, 50);
    
                    Table table = new Table();
                    flowDocument.Blocks.Add(table);
    
                    //... заполнение table ...
     
                      printDialog.PrintDocument(((IDocumentPaginatorSource)flowDocument).DocumentPaginator, "A Flow Document");
                 }
    

    • Помечено в качестве ответа ilya83 11 декабря 2017 г. 5:58
    11 декабря 2017 г. 5:58