2011-02-01 5 views
4

У меня есть DataTable, содержащий произвольное количество столбцов и строк, которые я пытаюсь распечатать. Самое удачное, что я до сих пор имел, - это поместить данные в таблицу, а затем добавить таблицу в FlowDocument.WPF - FlowDocument - растянуть таблицу до полной ширины?

Пока все хорошо. Проблема, которую я сейчас имею в виду, заключается в том, что таблица «хочет» занимать примерно половину ширины документа. Я уже установил соответствующие значения для свойств PageWidth и ColumnWidth для FlowDocument, но таблица, похоже, не хочет растягиваться, чтобы заполнить выделенное пространство?

+0

Я закончил использование FixedDocument, чтобы заставить это работать, но если у кого-то есть понимание использования FlowDocument, я все равно буду его слушать. –

ответ

0

Мне повезло с этим: How to set the original width of a WPF FlowDocument, хотя это заняло около 90% пространства.

+0

Фактически, 10% неиспользованного пространства было связано с тем, что я добавил PagePadding = "0.5in" в FlowDocument, что было необходимо для того, чтобы страница не была отрублена, когда я ее распечатал. –

4

Чтобы установить содержимое FlowDocument в полный доступный widh, вы должны сначала узнать ширину страницы. Свойство, которое вы должны установить, которое заботится о длине содержимого, - это ColumnWidth опора на FlowDocument.

Обычно я создаю вспомогательный класс «PrintLayout» для сохранения известных пресетов для ширины страницы/высоты и заполнения. Wou может snif пресетов из Ms Word и заполнить больше.

Класс для PrintLayout

public class PrintLayout 
{ 
    public static readonly PrintLayout A4 = new PrintLayout("29.7cm", "42cm", "3.18cm", "2.54cm"); 
    public static readonly PrintLayout A4Narrow = new PrintLayout("29.7cm", "42cm", "1.27cm", "1.27cm"); 
    public static readonly PrintLayout A4Moderate = new PrintLayout("29.7cm", "42cm", "1.91cm", "2.54cm"); 

    private Size _Size; 
    private Thickness _Margin; 

    public PrintLayout(string w, string h, string leftright, string topbottom) 
     : this(w,h,leftright, topbottom, leftright, topbottom) { 
    } 

    public PrintLayout(string w, string h, string left, string top, string right, string bottom) { 
     var converter = new LengthConverter(); 
     var width = (double)converter.ConvertFromInvariantString(w); 
     var height = (double)converter.ConvertFromInvariantString(h); 
     var marginLeft = (double)converter.ConvertFromInvariantString(left); 
     var marginTop = (double)converter.ConvertFromInvariantString(top); 
     var marginRight = (double)converter.ConvertFromInvariantString(right); 
     var marginBottom = (double)converter.ConvertFromInvariantString(bottom); 
     this._Size = new Size(width, height); 
     this._Margin = new Thickness(marginLeft, marginTop, marginRight, marginBottom); 

    } 


    public Thickness Margin { 
     get { return _Margin; } 
     set { _Margin = value; } 
    } 

    public Size Size { 
     get { return _Size; } 
    } 

    public double ColumnWidth { 
     get { 
      var column = 0.0; 
      column = this.Size.Width - Margin.Left - Margin.Right; 
      return column; 
     } 
    } 
} 

следующий на вашем FlowDocument вы можете установить пресеты

На Xaml

<FlowDocument x:Class="WpfApp.MyPrintoutView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:WpfApp" 
     mc:Ignorable="d" 
     PageHeight="{Binding Height, Source={x:Static local:PrintLayout.A4}}" 
     PageWidth="{Binding Width, Source={x:Static local:PrintLayout.A4}}" 
     PagePadding="{Binding Margin, Source={x:Static local:PrintLayout.A4}}" 
     ColumnWidth="{Binding ColumnWidth, Source={x:Static local:PrintLayout.A4}}" 
     FontFamily="Segoe WP" 
     FontSize="16" ColumnGap="4"> 
     <!-- flow elements --> 
</FlowDocument> 

По коду

FlowDocument result = new WpfApp.MyPrintoutView(); 
result.PageWidth = PrintLayout.A4.Size.Width; 
result.PageHeight = PrintLayout.A4.Size.Height; 
result.PagePadding = PrintLayout.A4.Margin; 
result.ColumnWidth = PrintLayout.A4.ColumnWidth; 
+1

Спасибо за это, это очень помогло мне. Просто небольшая коррекция: размер бумаги A4 составляет 21 см х 29,7 см, A3 составляет 29,7 см х 42 см. – solarc