WPF - FlowDocument - растянуть таблицу на всю ширину? - PullRequest
6 голосов
/ 01 февраля 2011

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

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

Ответы [ 2 ]

5 голосов
/ 20 июля 2012

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

Обычно я создаю вспомогательный класс PrintLayout, чтобы сохранить известные предварительные настройки для ширины страницы./ высота и обивкаВы можете прослушать пресеты из 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;
0 голосов
/ 16 апреля 2011

Мне повезло с этим: Как установить исходную ширину WPF FlowDocument , хотя это занимало только около 90% пространства.

...