首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算FixedPage尺寸

如何计算FixedPage尺寸
EN

Stack Overflow用户
提问于 2013-10-03 20:45:15
回答 1查看 2.6K关注 0票数 0

这个片段是一些用于生成XPS文档的代码的一部分。XPS文档的生成不是开玩笑。如果可能的话,我希望避免在这里粘贴任何XPS代码。相反,这段代码侧重于问题的WPF部分。

我要你帮忙的问题就在这里。我对尺寸进行了硬编码,以获得测试图像:

代码语言:javascript
复制
double magicNumber_X = 3.5;//trial and error...3 too small 4 too big
fixedPage.Arrange(new Rect(new Point(magicNumber_X, 0), size));

相反,我如何修正这段代码来计算坐标呢?

完整方法:

代码语言:javascript
复制
    private PageContent AddContentFromImage()
    {
        var pageContent = new PageContent();
        var fixedPage = new FixedPage();            

        var bitmapImage = new BitmapImage(new Uri(hardCodedImageSampleFilePath, UriKind.RelativeOrAbsolute));

        var image = new Image();
        image.Source = bitmapImage;            
        fixedPage.Children.Add(image);

        ((IAddChild)pageContent).AddChild(fixedPage);

        double pageWidth = 96 * 8.5;//XPS documents are 96 units per inch
        double pageHeight = 96 * 11;

        fixedPage.Width = pageWidth;
        fixedPage.Height = pageHeight;

        var size = new Size(8.5 * 96, 11 * 96);

        fixedPage.Measure(size);
        double magicNumber_X = 3.5;//trial and error...3 too small 4 too big
        double magicNumber_Y = 0;
        fixedPage.Arrange(new Rect(new Point(magicNumber_X, magicNumber_Y), size));
        fixedPage.UpdateLayout();

        return pageContent;
    }

我有点惊讶,FixedPage.Measure(size)没有自己纠正这个问题。我试着不通过平行线,例如fixedPage.Arrange(new Rect(), size))仍然没有通过。

FWIW,这个计算在我使用PrintDocument时工作得很好。

代码语言:javascript
复制
private void pd_PrintPage(object sender, PrintPageEventArgs e)
    {
        Graphics g = e.Graphics;
        RectangleF marginBounds = e.MarginBounds;
        RectangleF printableArea = e.PageSettings.PrintableArea;

        int availableWidth = (int)Math.Floor(printDocument.OriginAtMargins ? marginBounds.Width : (e.PageSettings.Landscape ? printableArea.Height : printableArea.Width));
        int availableHeight = (int)Math.Floor(printDocument.OriginAtMargins ? marginBounds.Height : (e.PageSettings.Landscape ? printableArea.Width : printableArea.Height));

        Rectangle rectangle = new Rectangle(0,0, availableWidth -1, availableHeight - 1);        
        g.DrawImage(_image, rectangle);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-09 13:36:59

我链接到了FixedPage.Loaded事件,因为要执行计算,需要使用FixedPage.ActualHeight,并且在加载控件之前不会设置。这也意味着,使用这种机制,必须显示FixedPage才能正确执行自动打印。

代码语言:javascript
复制
    void fixedPage_Loaded(object sender, RoutedEventArgs e)
    {
        var fixedDocument = sender as FixedPage;
        CalculateSize(fixedDocument);
    }
    private void CalculateSize(FixedPage fixedPage)
    {
        PrintQueue printQueue = LocalPrintServer.GetDefaultPrintQueue();
        PrintCapabilities capabilities = printQueue.GetPrintCapabilities();

        //get scale of the print wrt to screen of WPF visual
        double scale = Math.Min(capabilities.PageImageableArea.ExtentWidth / fixedPage.ActualWidth, capabilities.PageImageableArea.ExtentHeight / fixedPage.ActualHeight);

        //Transform the Visual to scale
        fixedPage.LayoutTransform = new ScaleTransform(scale, scale);

        //get the size of the printer page
        var sz = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);

        //update the layout of the visual to the printer page size.
        fixedPage.Measure(sz);
        double x = capabilities.PageImageableArea.OriginWidth;
        double y = capabilities.PageImageableArea.OriginHeight;
        fixedPage.Arrange(new Rect(new Point(x, y), sz));
        fixedPage.UpdateLayout();
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19168930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档