从Silverlight打印图像

本文关键字:图像 打印 Silverlight | 更新日期: 2023-09-27 17:57:53

我正在Silverlight中尝试以横向模式打印图像。

我在这里找到了一个很好的例子。大部分代码来自哪里。代码如预期的那样完美地工作。当我将行更改为图像时,它失败了。

代码

       Canvas OuterCanvas = new Canvas();

       /* a container for everything that will print */
       Border OuterBorder = new Border()
       {
           BorderThickness = new Thickness(3),
           BorderBrush = new SolidColorBrush(Colors.Red),
           Margin = new Thickness(10)
       };
       double Width = e.PrintableArea.Width - OuterBorder.Margin.Left - OuterBorder.Margin.Right;
       double Height = e.PrintableArea.Height - OuterBorder.Margin.Top - OuterBorder.Margin.Bottom;

       /* NOTE: We're trying to force landscape, so swop the width and height */
       OuterBorder.Width = Height;
       OuterBorder.Height = Width;

       /* on portrait, this line goes down (leave the printer settings, we're trying to force landscape) */
       Line Line = new Line()
       {
           X1 = OuterBorder.Width / 2,
           Y1 = 0,
           X2 = OuterBorder.Width / 2,
           Y2 = OuterBorder.Height,
           Stroke = new SolidColorBrush(Colors.Blue),
           StrokeThickness = 3
       };

       //
       // Here is where I changed the Line to an Image
       //
       OuterBorder.Child = imageElementInXaml; //Line;
       OuterCanvas.Children.Add(OuterBorder);

       /* rotate 90 degrees, and move into place */
       var transformGroup = new TransformGroup();
       transformGroup.Children.Add(new RotateTransform() { Angle = 90 });
       transformGroup.Children.Add(new TranslateTransform() { X = e.PrintableArea.Width });
       OuterBorder.RenderTransform = transformGroup;
       e.PageVisual = OuterCanvas;
       e.HasMorePages = false;

我知道Border只能包含一个我已经这样做过的元素,当我自己打印图像而不尝试使其横向时,这也起到了作用。那么,当我简单地用图像Element 替换Line时,为什么它不起作用呢

从Silverlight打印图像

所以自从发布这篇文章以来,我发现了一些代码(现在记不清在哪里了),这些代码帮助我完成了打印。它没有我想要的那么干净,但它很管用。

    void pd_PrintPage(object sender, PrintPageEventArgs e)
    {
        Image image = new Image();
        image.Source = imgPlayer.Source;

        //This is important
        image.Stretch = Stretch.Uniform;

        // Find the full size of the page
        Size pageSize =  new Size(e.PrintableArea.Width  + e.PageMargins.Left + e.PageMargins.Right, e.PrintableArea.Height + e.PageMargins.Top + e.PageMargins.Bottom);
        var MARGIN= 10;
        // Get additional margins to bring the total to MARGIN (= 96)
        Thickness additionalMargin = new Thickness
        {
            Left = Math.Max(0, MARGIN - e.PageMargins.Left),
            Top = Math.Max(0, MARGIN - e.PageMargins.Top),
            Right = Math.Max(0, MARGIN - e.PageMargins.Right),
            Bottom = Math.Max(0, MARGIN - e.PageMargins.Bottom)
        };

        // Find the area for display purposes
        Size displayArea = new Size(e.PrintableArea.Width - additionalMargin.Left - additionalMargin.Right,  e.PrintableArea.Height  - additionalMargin.Top - additionalMargin.Bottom);
        bool pageIsLandscape = displayArea.Width > displayArea.Height;
        bool imageIsLandscape = image.ActualWidth > image.ActualHeight;
        double displayAspectRatio = displayArea.Width / displayArea.Height;
        double imageAspectRatio = (double)image.ActualWidth / image.ActualHeight;
        double scaleX = Math.Min(1, imageAspectRatio / displayAspectRatio);
        double scaleY = Math.Min(1, displayAspectRatio / imageAspectRatio);

        // Calculate the transform matrix
        MatrixTransform transform = new MatrixTransform();
        if (pageIsLandscape == imageIsLandscape)
        {
        // Pure scaling
            transform.Matrix = new Matrix(scaleX, 0, 0, scaleY, 0, 0);
        }
        else
        {
            // Scaling with rotation
            scaleX *= pageIsLandscape ? displayAspectRatio : 1 /   displayAspectRatio;
            scaleY *= pageIsLandscape ? displayAspectRatio : 1 /   displayAspectRatio;
            transform.Matrix = new Matrix(0, scaleX, -scaleY, 0, 0, 0);
        }
        Image image2 = new Image
        {
            Source = image.Source,
            Stretch = Stretch.Fill,
            Width = displayArea.Width,
            Height = displayArea.Height,
            RenderTransform = transform,
            RenderTransformOrigin = new Point(0.5, 0.5),
            HorizontalAlignment = HorizontalAlignment.Center,
            VerticalAlignment = VerticalAlignment.Center,
            Margin = additionalMargin,
        };
        Border border = new Border
        {
            Child = image,
        };
        e.PageVisual = border;
    }