gpt4 book ai didi

WPF FlowDocument 缩放以适合页面

转载 作者:行者123 更新时间:2023-12-04 21:00:39 32 4
gpt4 key购买 nike

由于 BlockUIContainer 中的 ItemsControl,我有一个 FlowDocument 高度不同。在某些情况下,ItemsControl 会超出页面高度。如果需要,有没有办法在打印之前缩放 FlowDocument 以适合页面(8.5"X 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;
}
}

关于WPF FlowDocument 缩放以适合页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1267046/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com