/// <summary>
        /// Renders the element to the provided page (container).
        /// </summary>
        /// <param name="container">The container.</param>
        /// <param name="visual">The visual.</param>
        /// <param name="alignment">The alignment.</param>
        private void RenderElement(ContainerVisual container, FrameworkElement visual, PrintElementType alignment)
        {
            if (visual == null) return;

            var drawingVisual = new DrawingVisual();
            using (var dc = drawingVisual.RenderOpen())
            {
                var visualX = 0d;
                var visualY = 0d;
                var visualHeight = visual.DesiredSize.Height;
                var visualWidth = visual.DesiredSize.Width;

                switch (alignment)
                {
                    case PrintElementType.Header:
                        visualY = OriginalPrintMargin.Top;
                        visualX = OriginalPrintMargin.Left;
                        break;
                    case PrintElementType.Footer:
                        visualY = TotalPrintableArea.Height - OriginalPrintMargin.Bottom - visual.DesiredSize.Height;
                        visualX = OriginalPrintMargin.Left;
                        break;
                    case PrintElementType.Watermark:
                        var totalWidth = TotalPrintableArea.Width - OriginalPrintMargin.Left - OriginalPrintMargin.Right;
                        var totalHeight = TotalPrintableArea.Height - OriginalPrintMargin.Top - OriginalPrintMargin.Bottom;
                        visualX = ((totalWidth - visualWidth)/2) + OriginalPrintMargin.Left;
                        visualY = ((totalHeight - visualHeight)/2) + OriginalPrintMargin.Right;
                        break;
                }


                if (visual.Margin.Top > 0.0001 || visual.Margin.Left > 0.0001 || visual.Margin.Right > 0.0001 || visual.Margin.Bottom > 0.0001)
                {
                    visualX += visual.Margin.Left;
                    visualY += visual.Margin.Top;
                    visualHeight -= (visual.Margin.Top + visual.Margin.Bottom);
                    visualWidth -= (visual.Margin.Left + visual.Margin.Right);
                }

                // We need to clone the visual, so we can change the same visual individually on each page if need be
                var xaml = XamlWriter.Save(visual);
                var stringReader = new StringReader(xaml);
                var xmlReader = XmlReader.Create(stringReader);
                var newVisual = (FrameworkElement) XamlReader.Load(xmlReader);
                newVisual.DataContext = visual.DataContext;
                newVisual.Resources = visual.Resources;

                CheckVisualForSpecialRuns(newVisual);
                var brush = new VisualBrush(newVisual) {Stretch = Stretch.None};
                var renderRect = new Rect(visualX, visualY, visualWidth, visualHeight);

                if (DocumentPrintMargin.Top > 0 || DocumentPrintMargin.Left > 0)
                    dc.PushTransform(new TranslateTransform(DocumentPrintMargin.Left * -1, DocumentPrintMargin.Top * -1));
                dc.DrawRectangle(brush, new Pen(Brushes.Transparent, 0d), renderRect);
                if (DocumentPrintMargin.Top > 0 || DocumentPrintMargin.Left > 0)
                    dc.Pop();
            }
            container.Children.Add(drawingVisual);
        }
示例#2
0
        /// <summary>
        /// Renders the element to the provided page (container).
        /// </summary>
        /// <param name="container">The container.</param>
        /// <param name="visual">The visual.</param>
        /// <param name="alignment">The alignment.</param>
        private void RenderElement(ContainerVisual container, FrameworkElement visual, PrintElementType alignment)
        {
            if (visual == null)
            {
                return;
            }

            var drawingVisual = new DrawingVisual();

            using (var dc = drawingVisual.RenderOpen())
            {
                var visualX      = 0d;
                var visualY      = 0d;
                var visualHeight = visual.DesiredSize.Height;
                var visualWidth  = visual.DesiredSize.Width;

                switch (alignment)
                {
                case PrintElementType.Header:
                    visualY = OriginalPrintMargin.Top;
                    visualX = OriginalPrintMargin.Left;
                    break;

                case PrintElementType.Footer:
                    visualY = TotalPrintableArea.Height - OriginalPrintMargin.Bottom - visual.DesiredSize.Height;
                    visualX = OriginalPrintMargin.Left;
                    break;

                case PrintElementType.Watermark:
                    var totalWidth  = TotalPrintableArea.Width - OriginalPrintMargin.Left - OriginalPrintMargin.Right;
                    var totalHeight = TotalPrintableArea.Height - OriginalPrintMargin.Top - OriginalPrintMargin.Bottom;
                    visualX = ((totalWidth - visualWidth) / 2) + OriginalPrintMargin.Left;
                    visualY = ((totalHeight - visualHeight) / 2) + OriginalPrintMargin.Right;
                    break;
                }


                if (visual.Margin.Top > 0.0001 || visual.Margin.Left > 0.0001 || visual.Margin.Right > 0.0001 || visual.Margin.Bottom > 0.0001)
                {
                    visualX      += visual.Margin.Left;
                    visualY      += visual.Margin.Top;
                    visualHeight -= (visual.Margin.Top + visual.Margin.Bottom);
                    visualWidth  -= (visual.Margin.Left + visual.Margin.Right);
                }

                // We need to clone the visual, so we can change the same visual individually on each page if need be
                var xaml         = XamlWriter.Save(visual);
                var stringReader = new StringReader(xaml);
                var xmlReader    = XmlReader.Create(stringReader);
                var newVisual    = (FrameworkElement)XamlReader.Load(xmlReader);
                newVisual.DataContext = visual.DataContext;
                newVisual.Resources   = visual.Resources;

                CheckVisualForSpecialRuns(newVisual);
                var brush = new VisualBrush(newVisual)
                {
                    Stretch = Stretch.None
                };
                var renderRect = new Rect(visualX, visualY, visualWidth, visualHeight);

                if (DocumentPrintMargin.Top > 0 || DocumentPrintMargin.Left > 0)
                {
                    dc.PushTransform(new TranslateTransform(DocumentPrintMargin.Left * -1, DocumentPrintMargin.Top * -1));
                }
                dc.DrawRectangle(brush, new Pen(Brushes.Transparent, 0d), renderRect);
                if (DocumentPrintMargin.Top > 0 || DocumentPrintMargin.Left > 0)
                {
                    dc.Pop();
                }
            }
            container.Children.Add(drawingVisual);
        }