/// <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); }
/// <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); }