WPF - FlowDocument - Stretch Table to Entire Width?

落爺英雄遲暮 提交于 2019-12-01 04:43:25
Kelly Cline

I had some luck with this: How to set the original width of a WPF FlowDocument, although it only took up about 90% of the space.

In order to set your FlowDocument contents to the full available widh you must first know the width of the page. The property you need to set that takes care of the content length is the ColumnWidth prop on the FlowDocument.

I usualy create a "PrintLayout" helper class to keep known presets for the Page width/hight and Padding. Wou can snif presets from Ms Word and fill more.

The class for 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;
        }
    }
}

next on your FlowDocument you can set the presets

On 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>

By code

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;
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!