WPF的FlowDocument缩放到适合页面
-
13-09-2019 - |
题
我有在高度由于一个ItemsControl在BlockUIContainer变化的的FlowDocument。在某些情况下,ItemsControl的超出页面高度。有以缩放的FlowDocument右如果需要在打印前以适合页面(8.5" ×11" )的方法吗?
截至目前,所述的FlowDocument被命名为“doc的”和我使用印刷的方法是:
private void Print_Click(object sender, RoutedEventArgs e)
{
PrintDialog pd = new PrintDialog();
doc.PageHeight = pd.PrintableAreaHeight;
doc.PageWidth = pd.PrintableAreaWidth;
doc.ColumnGap = 0;
doc.ColumnWidth = pd.PrintableAreaWidth;
IDocumentPaginatorSource dps = doc;
pd.PrintDocument(dps.DocumentPaginator, "Sheet");
}
解决方案
我知道这是一个有点晚了,但这里是我想出了一个解决方案。
首先,我们创建了一个包装,会为我们生成文档页面。每个页面将具有应用于其上的标度变换返回之前。
public class FittedDocumentPaginator : DocumentPaginator
{
public DocumentPaginator Base { get; private set; }
public double Scale { get; private set; }
private readonly ScaleTransform _sTransform;
public FittedDocumentPaginator( DocumentPaginator baseDp, double scale )
{
if ( baseDp == null )
throw new ArgumentNullException( "baseDp" );
Base = baseDp;
Scale = scale;
_sTransform = new ScaleTransform( scale, scale );
}
public override DocumentPage GetPage( int pageNumber )
{
var page = Base.GetPage( pageNumber );
( (ContainerVisual)page.Visual ).Transform = _sTransform;
return page;
}
public override bool IsPageCountValid
{
get { return Base.IsPageCountValid; }
}
public override int PageCount
{
get { return Base.PageCount; }
}
public override Size PageSize
{
get { return Base.PageSize; }
set { Base.PageSize = value; }
}
public override IDocumentPaginatorSource Source
{
get { return Base.Source; }
}
}
使用它相当简单:
private void PrintDocument( PrintDialog pd, FlowDocument document, double scale, string title )
{
DocumentPaginator dp = ( (IDocumentPaginatorSource)document ).DocumentPaginator;
FittedDocumentPaginator fdp = new FittedDocumentPaginator( dp, scale );
pd.PrintDocument( fdp, title );
}
如果你有兴趣,这里是我们如何确定的规模。在我们的情况下,文档被延长过去的页面宽度,但是它可以很容易地被修改以适应页面的高度。
private void Print( FlowDocument document, string title, double documentWidth )
{
var pd = new PrintDialog();
if ( pd.ShowDialog() == true )
{
// Set the printing margins.
Thickness pageMargins = document.PagePadding;
document.PagePadding = new Thickness( 15.0 );
// In our case, the document's width is NaN so we have to navigate the visual tree to get the ActualWidth, which is represented by 'documentWidth'.
double scale = documentWidth / pd.PrintableAreaWidth;
if ( scale < 1.0 )
{
// The report fits on the page just fine. Don't scale.
scale = 1.0;
}
double invScale = 1 / scale;
document.PageHeight = pd.PrintableAreaHeight * scale;
document.PageWidth = pd.PrintableAreaWidth * scale;
DocumentPaginator dp = ( (IDocumentPaginatorSource)document ).DocumentPaginator;
FittedDocumentPaginator fdp = new FittedDocumentPaginator( dp, invScale );
pd.PrintDocument( fdp, title );
// Restore the original values so the GUI isn't altered.
document.PageHeight = Double.NaN;
document.PageWidth = Double.NaN;
document.PagePadding = pageMargins;
}
}
不隶属于 StackOverflow