Printing viewport

2019-05-31 16:22发布

C# wpf 3D visual studio 2010 net 4.5

Hi

I am trying to print out the 3D image I have created but can not get it right. The image that is printed is changing in size depending on how large the window is etc. or it is clipped etc.

What I would like is to print the view port on the printer, stretching it so wide as the paper is and keeping aspect ration.

        PrintDialog dialog = new PrintDialog();
        if (dialog.ShowDialog() != true)
        { return; }

        StackPanel myPanel = new StackPanel();
        myPanel.Margin = new Thickness(40);

        Image myImage = new Image();
        myImage.Width = dialog.PrintableAreaWidth - (2 * MYDPI);
        myImage.Stretch = Stretch.Uniform;
        RenderTargetBitmap bmp = new RenderTargetBitmap((int)dialog.PrintableAreaWidth, (int)dialog.PrintableAreaWidth, 96, 96, PixelFormats.Pbgra32);
        bmp.Render(myViewPort);

        myImage.Source = bmp;

        myPanel.Children.Add(myImage);

        myPanel.Measure(new Size(dialog.PrintableAreaWidth, dialog.PrintableAreaHeight));
        myPanel.Arrange(new Rect(new Point(0, 0), myPanel.DesiredSize));

        dialog.PrintVisual(myPanel, myName);

1条回答
劫难
2楼-- · 2019-05-31 17:15

The following worked, now the picture get scaled to the size of the paper regardless of the size of the viewport

...

        PrintDialog dialog = new PrintDialog();

        if (dialog.ShowDialog() != true)
        { 
            return; 
        }


        Grid grid = new Grid();

        grid.Margin = new Thickness(40);

        //do this for each column
        ColumnDefinition coldef;
        coldef = new ColumnDefinition();
        coldef.Width = new GridLength(dialog.PrintableAreaWidth, GridUnitType.Pixel);
        grid.ColumnDefinitions.Add(coldef);

        //do this for each row
        RowDefinition rowdef;
        rowdef = new RowDefinition();
        rowdef.Height = new GridLength(1, GridUnitType.Auto);
        grid.RowDefinitions.Add(rowdef);
        //
        rowdef = new RowDefinition();
        rowdef.Height = new GridLength(1, GridUnitType.Auto);
        grid.RowDefinitions.Add(rowdef);

        TextBlock myTitle = new TextBlock();
        myTitle.FontSize = 24;
        myTitle.FontFamily = new FontFamily("Arial");
        myTitle.TextAlignment = TextAlignment.Center;
        myTitle.Text = myName;

        grid.Children.Add(myTitle);
        //put it in column 0, row 0
        Grid.SetColumn(myTitle, 0);
        Grid.SetRow(myTitle, 0);

        Image myImage = new Image();
        RenderTargetBitmap bmp = new RenderTargetBitmap((int)this.Width, (int)this.Height, 96, 96, PixelFormats.Pbgra32);
        bmp.Render(myViewPort);

        myImage.Source = bmp;
        myImage.Stretch = Stretch.Uniform;

        grid.Children.Add(myImage);
        //put it in column 0, row 1
        Grid.SetColumn(myImage, 0);
        Grid.SetRow(myImage, 1);

        grid.Measure(new Size(dialog.PrintableAreaWidth, dialog.PrintableAreaHeight));
        grid.Arrange(new Rect(new Point(0, 0), grid.DesiredSize));

        dialog.PrintVisual(grid, myName);
查看更多
登录 后发表回答