首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF DocumentPaginator:将DocumentPage大小更改为横向

WPF DocumentPaginator:将DocumentPage大小更改为横向
EN

Stack Overflow用户
提问于 2020-07-09 20:41:32
回答 1查看 420关注 0票数 0

我尝试使用A4横向格式(尺寸( 96 * 11,96* 8.5))的DocumentPaginator将WPF窗口打印为pdf文件(Microsoft print to pdf),但总是以A4纵向格式打印出来。(对于DocumentPaginator,我使用如下所述的方法:WPF - pagination when printing a visual)

故障出在哪里?除非格式有问题,否则它可以完美地工作。如何根据DocumentPage.Size属性的文档中的说明调整DocumentPage的大小:"Remarks...Use the protected SetSize method to set this property“?

XAML:

代码语言:javascript
复制
<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    
    <Grid>
        <Button x:Name="but_print" HorizontalAlignment="Center" VerticalAlignment="Top" Width="35" Height="35" Padding="0" Margin="0,5,10,5" BorderThickness="0" BorderBrush="#FFDDDDDD"  Background="{x:Null}" VerticalContentAlignment="Top" Click="InvokePrint">
            <Border  x:Name="bor_print" CornerRadius="5,5,5,5" Height="Auto" Width="Auto" BorderThickness="2" Padding="1" Margin="0" HorizontalAlignment="Left" VerticalAlignment="Top" BorderBrush="#FFDDDDDD" ScrollViewer.VerticalScrollBarVisibility="Auto">
                <Image x:Name="image23" Source="C:\Users\RB\Documents\Visual Studio 2015\Projects\WpfApplication1\WpfApplication1\Icons\Drucken.png"/>
            </Border>
        </Button>
        <ScrollViewer x:Name="scrollv1" Grid.Column="0" Grid.Row="2" VerticalScrollBarVisibility="Auto"  HorizontalScrollBarVisibility="Auto" Margin="0,0,0,0" Height ="Auto" Width ="Auto" Padding="0" VerticalContentAlignment="Stretch" HorizontalAlignment="Left">
            <StackPanel x:Name="grdMain" Margin="0" HorizontalAlignment="Left" VerticalAlignment="Top">
                <TextBlock x:Name="textBlock1" HorizontalAlignment="Right" Text="Test" TextWrapping="Wrap" FontSize="24" FlowDirection="RightToLeft" Margin="0,0,0,0"/>
            </StackPanel>
        </ScrollViewer>
    </Grid>
</Window>

C#:

代码语言:javascript
复制
  public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void InvokePrint(object sender, RoutedEventArgs e)
        {
            var dlg = new PrintDialog();
            if ((bool)dlg.ShowDialog())
            {
                Size lv_size = new Size(dlg.PrintableAreaWidth, dlg.PrintableAreaHeight);
                FixedPagePaginator fixedpagepagi = new FixedPagePaginator(scrollv1, lv_size);

                fixedpagepagi.PageSize = new Size(dlg.PrintableAreaWidth, dlg.PrintableAreaHeight);
                dlg.PrintDocument(fixedpagepagi, "Test");
            }
        }
    }

    class FixedPagePaginator : DocumentPaginator
    {
        private FrameworkElement Element;
        private Size Size;
        private FixedPagePaginator()
        {
        }

        public FixedPagePaginator(FrameworkElement element, Size size)
        {
            Element = element;
            Size = size;
        }

        public override DocumentPage GetPage(int pageNumber)
        {
            Size elementSize = new Size(
                Element.ActualWidth,
                Element.ActualHeight);
            Element.Measure(elementSize);
            Element.Arrange(new Rect(new Point(0, 0), elementSize));

            Element.Measure(Size);
            Element.Arrange(new Rect(Size));

            var page = new DocumentPage(Element);
            return page;
        }

        public override bool IsPageCountValid
        {
            get { return true; }
        }

        public int Columns
        {
            get
            {
                return 1;
            }
        }
        public int Rows
        {
            get
            {
                return (int)Math.Ceiling(Element.ActualHeight / PageSize.Height);
            }
        }

        public override int PageCount
        {
            get
            {
                return Columns * Rows;
            }
        }

        public override System.Windows.Size PageSize
        {
            get
            {
                return Size;
            }

            set
            {
                if (Size.Equals(value) != true)
                {
                    Size = value;
                }
            }
        }

        public override IDocumentPaginatorSource Source
        {
            get { return null; }
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-12 17:03:20

我在CSharp论坛上得到的工作解决方案是用PageSize初始化DocumentPage,例如:

代码语言:javascript
复制
private DocumentPage CreatePage(Grid grid)
{
    var box = this.SizingPageGrid(grid);

    return new DocumentPage(grid, this.PageSize, box, box);
}

private Rect SizingPageGrid(Grid grid)
{
    var box = new Rect(new Point(0, 0), this.PageSize);

    grid.InvalidateArrange();
    grid.UpdateLayout();
    grid.Measure(this.PageSize);
    grid.Arrange(box);

    return box;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62815067

复制
相关文章

相似问题

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