栗子:

            PrintDialog pd = new PrintDialog();
            if (pd.ShowDialog() == true)

            {
                DrawingVisual visual = new DrawingVisual();
                using (DrawingContext dc = visual.RenderOpen())
                {
                    Point p = new Point(0, 0);
                    FormattedText ft = new FormattedText(@"中华人民共和国万岁", System.Globalization.CultureInfo.CurrentCulture, FlowDirection.LeftToRight, new Typeface("黑体"), 20, Brushes.Black, 1);
                    dc.DrawText(ft, p);
                    p.Y += ft.Height;

                    ft = new FormattedText(@"中华人民共和国万岁", System.Globalization.CultureInfo.CurrentCulture, FlowDirection.LeftToRight, new Typeface("楷体"), 20, Brushes.Black, 1);
                    dc.DrawText(ft, p);
                    p.Y += ft.Height;

                    ft = new FormattedText(@"中华人民共和国万岁", System.Globalization.CultureInfo.CurrentCulture, FlowDirection.LeftToRight, new Typeface("宋体"), 20, Brushes.Black, 1);
                    dc.DrawText(ft, p);
                    p.Y += ft.Height;
                    dc.DrawLine(new Pen(Brushes.Black, 1), p, new Point(ft.Width, p.Y));
                }
                pd.PrintVisual(visual, "test");
            }

一、 PrintDialog

  1. showDialog():显示打印设置
  2. PrintableAreaWidth、PrintableAreaHeight:获取打印纸的宽高,单位为1/96英寸

**二、DrawingVisusual
RenderOpen():生成DrawingContext(打印上下文,相当于Graphics?)

**三、DrawingContext
各种Draw:

 //
        // 摘要:
        //     Closes the System.Windows.Media.DrawingContext and flushes the content. Afterward,
        //     the System.Windows.Media.DrawingContext cannot be modified.
        //
        // 异常:
        //   T:System.ObjectDisposedException:
        //     This object has already been closed or disposed.
        public abstract void Close();
        //
        // 摘要:
        //     Draws the specified System.Windows.Media.Drawing object.
        //
        // 参数:
        //   drawing:
        //     The drawing to append.
        public abstract void DrawDrawing(Drawing drawing);
        //
        // 摘要:
        //     Draws an ellipse with the specified System.Windows.Media.Brush and System.Windows.Media.Pen.
        //
        // 参数:
        //   brush:
        //     The brush with which to fill the ellipse. This is optional, and can be null.
        //     If the brush is null, no fill is drawn.
        //
        //   pen:
        //     The pen with which to stroke the ellipse. This is optional, and can be null.
        //     If the pen is null, no stroke is drawn.
        //
        //   center:
        //     The location of the center of the ellipse.
        //
        //   radiusX:
        //     The horizontal radius of the ellipse.
        //
        //   radiusY:
        //     The vertical radius of the ellipse.
        public abstract void DrawEllipse(Brush brush, Pen pen, Point center, double radiusX, double radiusY);
        //
        // 摘要:
        //     Draws an ellipse with the specified System.Windows.Media.Brush and System.Windows.Media.Pen
        //     and applies the specified animation clocks.
        //
        // 参数:
        //   brush:
        //     The brush with which to fill the ellipse. This is optional, and can be null.
        //     If the brush is null, no fill is drawn.
        //
        //   pen:
        //     The pen with which to stroke the ellipse. This is optional, and can be null.
        //     If the pen is null, no stroke is drawn.
        //
        //   center:
        //     The location of the center of the ellipse.
        //
        //   centerAnimations:
        //     The clock with which to animate the ellipse's center position, or null for no
        //     animation. This clock must be created from an System.Windows.Media.Animation.AnimationTimeline
        //     that can animate System.Windows.Point objects.
        //
        //   radiusX:
        //     The horizontal radius of the ellipse.
        //
        //   radiusXAnimations:
        //     The clock with which to animate the ellipse's x-radius, or null for no animation.
        //     This clock must be created from an System.Windows.Media.Animation.AnimationTimeline
        //     that can animate System.Double objects.
        //
        //   radiusY:
        //     The vertical radius of the ellipse.
        //
        //   radiusYAnimations:
        //     The clock with which to animate the ellipse's y-radius, or null for no animation.
        //     This clock must be created from an System.Windows.Media.Animation.AnimationTimeline
        //     that can animate System.Double objects.
        public abstract void DrawEllipse(Brush brush, Pen pen, Point center, AnimationClock centerAnimations, double radiusX, AnimationClock radiusXAnimations, double radiusY, AnimationClock radiusYAnimations);
        //
        // 摘要:
        //     Draws the specified System.Windows.Media.Geometry using the specified System.Windows.Media.Brush
        //     and System.Windows.Media.Pen.
        //
        // 参数:
        //   brush:
        //     The System.Windows.Media.Brush with which to fill the System.Windows.Media.Geometry.
        //     This is optional, and can be null. If the brush is null, no fill is drawn.
        //
        //   pen:
        //     The System.Windows.Media.Pen with which to stroke the System.Windows.Media.Geometry.
        //     This is optional, and can be null. If the pen is null, no stroke is drawn.
        //
        //   geometry:
        //     The System.Windows.Media.Geometry to draw.
        public abstract void DrawGeometry(Brush brush, Pen pen, Geometry geometry);
        //
        // 摘要:
        //     Draws the specified text.
        //
        // 参数:
        //   foregroundBrush:
        //     The brush used to paint the text.
        //
        //   glyphRun:
        //     The text to draw.
        public abstract void DrawGlyphRun(Brush foregroundBrush, GlyphRun glyphRun);
        //
        // 摘要:
        //     Draws an image into the region defined by the specified System.Windows.Rect.
        //
        // 参数:
        //   imageSource:
        //     The image to draw.
        //
        //   rectangle:
        //     The region in which to draw bitmapSource.
        public abstract void DrawImage(ImageSource imageSource, Rect rectangle);
        //
        // 摘要:
        //     Draws an image into the region defined by the specified System.Windows.Rect and
        //     applies the specified animation clock.
        //
        // 参数:
        //   imageSource:
        //     The image to draw.
        //
        //   rectangle:
        //     The region in which to draw bitmapSource.
        //
        //   rectangleAnimations:
        //     The clock with which to animate the rectangle's size and dimensions, or null
        //     for no animation. This clock must be created from an System.Windows.Media.Animation.AnimationTimeline
        //     that can animate System.Windows.Rect objects.
        public abstract void DrawImage(ImageSource imageSource, Rect rectangle, AnimationClock rectangleAnimations);
        //
        // 摘要:
        //     Draws a line between the specified points using the specified System.Windows.Media.Pen
        //     and applies the specified animation clocks.
        //
        // 参数:
        //   pen:
        //     The pen to stroke the line.
        //
        //   point0:
        //     The start point of the line.
        //
        //   point0Animations:
        //     The clock with which to animate the start point of the line, or null for no animation.
        //     This clock must be created from an System.Windows.Media.Animation.AnimationTimeline
        //     that can animate System.Windows.Point objects.
        //
        //   point1:
        //     The end point of the line.
        //
        //   point1Animations:
        //     The clock with which to animate the end point of the line, or null for no animation.
        //     This clock must be created from an System.Windows.Media.Animation.AnimationTimeline
        //     that can animate System.Windows.Point objects.
        public abstract void DrawLine(Pen pen, Point point0, AnimationClock point0Animations, Point point1, AnimationClock point1Animations);
        //
        // 摘要:
        //     Draws a line between the specified points using the specified System.Windows.Media.Pen.
        //
        // 参数:
        //   pen:
        //     The pen with which to stroke the line.
        //
        //   point0:
        //     The start point of the line.
        //
        //   point1:
        //     The end point of the line.
        public abstract void DrawLine(Pen pen, Point point0, Point point1);
        //
        // 摘要:
        //     Draws a rectangle with the specified System.Windows.Media.Brush and System.Windows.Media.Pen.
        //     The pen and the brush can be null.
        //
        // 参数:
        //   brush:
        //     The brush with which to fill the rectangle. This is optional, and can be null.
        //     If the brush is null, no fill is drawn.
        //
        //   pen:
        //     The pen with which to stroke the rectangle. This is optional, and can be null.
        //     If the pen is null, no stroke is drawn.
        //
        //   rectangle:
        //     The rectangle to draw.
        public abstract void DrawRectangle(Brush brush, Pen pen, Rect rectangle);
        //
        // 摘要:
        //     Draws a rectangle with the specified System.Windows.Media.Brush and System.Windows.Media.Pen
        //     and applies the specified animation clocks.
        //
        // 参数:
        //   brush:
        //     The brush with which to fill the rectangle. This is optional, and can be null.
        //     If the brush is null, no fill is drawn.
        //
        //   pen:
        //     The pen with which to stroke the rectangle. This is optional, and can be null.
        //     If the pen is null, no stroke is drawn.
        //
        //   rectangle:
        //     The rectangle to draw.
        //
        //   rectangleAnimations:
        //     The clock with which to animate the rectangle's size and dimensions, or null
        //     for no animation. This clock must be created from an System.Windows.Media.Animation.AnimationTimeline
        //     that can animate System.Windows.Rect objects.
        public abstract void DrawRectangle(Brush brush, Pen pen, Rect rectangle, AnimationClock rectangleAnimations);
        //
        // 摘要:
        //     Draws a rounded rectangle with the specified System.Windows.Media.Brush and System.Windows.Media.Pen
        //     and applies the specified animation clocks.
        //
        // 参数:
        //   brush:
        //     The brush used to fill the rectangle, or null for no fill.
        //
        //   pen:
        //     The pen used to stroke the rectangle, or null for no stroke.
        //
        //   rectangle:
        //     The rectangle to draw.
        //
        //   rectangleAnimations:
        //     The clock with which to animate the rectangle's size and dimensions, or null
        //     for no animation. This clock must be created from an System.Windows.Media.Animation.AnimationTimeline
        //     that can animate System.Windows.Rect objects.
        //
        //   radiusX:
        //     The radius in the X dimension of the rounded corners. This value will be clamped
        //     to the range of 0 to System.Windows.Rect.Width/2
        //
        //   radiusXAnimations:
        //     The clock with which to animate the rectangle's radiusX value, or null for no
        //     animation. This clock must be created from an System.Windows.Media.Animation.AnimationTimeline
        //     that can animate System.Double values.
        //
        //   radiusY:
        //     The radius in the Y dimension of the rounded corners. This value will be clamped
        //     to a value between 0 to System.Windows.Rect.Height/2.
        //
        //   radiusYAnimations:
        //     The clock with which to animate the rectangle's radiusY value, or null for no
        //     animation. This clock must be created from an System.Windows.Media.Animation.AnimationTimeline
        //     that can animate System.Double values.
        public abstract void DrawRoundedRectangle(Brush brush, Pen pen, Rect rectangle, AnimationClock rectangleAnimations, double radiusX, AnimationClock radiusXAnimations, double radiusY, AnimationClock radiusYAnimations);
        //
        // 摘要:
        //     Draws a rounded rectangle with the specified System.Windows.Media.Brush and System.Windows.Media.Pen.
        //
        // 参数:
        //   brush:
        //     The brush used to fill the rectangle.
        //
        //   pen:
        //     The pen used to stroke the rectangle.
        //
        //   rectangle:
        //     The rectangle to draw.
        //
        //   radiusX:
        //     The radius in the X dimension of the rounded corners. This value will be clamped
        //     to the range of 0 to System.Windows.Rect.Width/2.
        //
        //   radiusY:
        //     The radius in the Y dimension of the rounded corners. This value will be clamped
        //     to a value between 0 to System.Windows.Rect.Height/2.
        public abstract void DrawRoundedRectangle(Brush brush, Pen pen, Rect rectangle, double radiusX, double radiusY);
        //
        // 摘要:
        //     Draws formatted text at the specified location.
        //
        // 参数:
        //   formattedText:
        //     The formatted text to be drawn.
        //
        //   origin:
        //     The location where the text is to be drawn.
        //
        // 异常:
        //   T:System.ObjectDisposedException:
        //     The object has already been closed or disposed.
        public void DrawText(FormattedText formattedText, Point origin);
        //
        // 摘要:
        //     Draws a video into the specified region.
        //
        // 参数:
        //   player:
        //     The media to draw.
        //
        //   rectangle:
        //     The region in which to draw player.
        public abstract void DrawVideo(MediaPlayer player, Rect rectangle);
        //
        // 摘要:
        //     Draws a video into the specified region and applies the specified animation clock.
        //
        // 参数:
        //   player:
        //     The media to draw.
        //
        //   rectangle:
        //     The area in which to draw the media.
        //
        //   rectangleAnimations:
        //     The clock with which to animate the rectangle's size and dimensions, or null
        //     for no animation. This clock must be created from an System.Windows.Media.Animation.AnimationTimeline
        //     that can animate System.Windows.Rect objects.
        public abstract void DrawVideo(MediaPlayer player, Rect rectangle, AnimationClock rectangleAnimations);
        //
        // 摘要:
        //     Pops the last opacity mask, opacity, clip, effect, or transform operation that
        //     was pushed onto the drawing context.
        public abstract void Pop();
        //
        // 摘要:
        //     Pushes the specified clip region onto the drawing context.
        //
        // 参数:
        //   clipGeometry:
        //     The clip region to apply to subsequent drawing commands.
        public abstract void PushClip(Geometry clipGeometry);
        //
        // 摘要:
        //     Pushes the specified System.Windows.Media.Effects.BitmapEffect onto the drawing
        //     context.
        //
        // 参数:
        //   effect:
        //     The effect to apply to subsequent drawings.
        //
        //   effectInput:
        //     The area to which the effect is applied, or null if the effect is to be applied
        //     to the entire area of subsequent drawings.
        [Obsolete("BitmapEffects are deprecated and no longer function.  Consider using Effects where appropriate instead.")]
        public abstract void PushEffect(BitmapEffect effect, BitmapEffectInput effectInput);
        //
        // 摘要:
        //     Pushes the specified System.Windows.Media.GuidelineSet onto the drawing context.
        //
        // 参数:
        //   guidelines:
        //     The guideline set to apply to subsequent drawing commands.
        public abstract void PushGuidelineSet(GuidelineSet guidelines);
        //
        // 摘要:
        //     Pushes the specified opacity setting onto the drawing context.
        //
        // 参数:
        //   opacity:
        //     The opacity factor to apply to subsequent drawing commands. This factor is cumulative
        //     with previous System.Windows.Media.DrawingContext.PushOpacity(System.Double)
        //     operations.
        public abstract void PushOpacity(double opacity);
        //
        // 摘要:
        //     Pushes the specified opacity setting onto the drawing context and applies the
        //     specified animation clock.
        //
        // 参数:
        //   opacity:
        //     The opacity factor to apply to subsequent drawing commands. This factor is cumulative
        //     with previous System.Windows.Media.DrawingContext.PushOpacity(System.Double)
        //     operations.
        //
        //   opacityAnimations:
        //     The clock with which to animate the opacity value, or null for no animation.
        //     This clock must be created from an System.Windows.Media.Animation.AnimationTimeline
        //     that can animate System.Double values.
        public abstract void PushOpacity(double opacity, AnimationClock opacityAnimations);
        //
        // 摘要:
        //     Pushes the specified opacity mask onto the drawing context.
        //
        // 参数:
        //   opacityMask:
        //     The opacity mask to apply to subsequent drawings. The alpha values of this brush
        //     determine the opacity of the drawing to which it is applied.
        public abstract void PushOpacityMask(Brush opacityMask);
        //
        // 摘要:
        //     Pushes the specified System.Windows.Media.Transform onto the drawing context.
        //
        // 参数:
        //   transform:
        //     The transform to apply to subsequent drawing commands.
        public abstract void PushTransform(Transform transform);

**四、FormattedText

//
        // 摘要:
        //     Initializes a new instance of the System.Windows.Media.FormattedText class with
        //     the specified text, culture, flow direction, typeface, font size, and brush.
        //
        // 参数:
        //   textToFormat:
        //     The text to be displayed.
        //
        //   culture:
        //     The specific culture of the text.
        //
        //   flowDirection:
        //     The direction the text is read.
        //
        //   typeface:
        //     The font family, weight, style and stretch the text should be formatted with.
        //
        //   emSize:
        //     The font size the text should be formatted at.
        //
        //   foreground:
        //     The brush used to paint the each glyph.
        [Obsolete("Use the PixelsPerDip override", false)]
        public FormattedText(string textToFormat, CultureInfo culture, FlowDirection flowDirection, Typeface typeface, double emSize, Brush foreground);
        //
        // 摘要:
        //     Initializes a new instance of the System.Windows.Media.FormattedText class with
        //     the specified text, culture, flow direction, typeface, font size, foreground
        //     brush, and pixelsPerDip value.
        //
        // 参数:
        //   textToFormat:
        //     The text to be displayed.
        //
        //   culture:
        //     The specific culture of the text.
        //
        //   flowDirection:
        //     The direction the text is read.
        //
        //   typeface:
        //     The font family, weight, style and stretch the text should be formatted with.
        //
        //   emSize:
        //     The font size for the text's em measure, provided in device-independent units
        //     (1/96th inch per unit).
        //
        //   foreground:
        //     The brush used to paint the each glyph.
        //
        //   pixelsPerDip:
        //     The Pixels Per Density Independent Pixel value, which is the equivalent of the
        //     scale factor. For example, if the DPI of a screen is 120 (or 1.25 because 120/96
        //     = 1.25) , 1.25 pixel per density independent pixel is drawn. DIP is the unit
        //     of measurement used by WPF to be independent of device resolution and DPIs.
        public FormattedText(string textToFormat, CultureInfo culture, FlowDirection flowDirection, Typeface typeface, double emSize, Brush foreground, double pixelsPerDip);
        //
        // 摘要:
        //     Initializes a new instance of the System.Windows.Media.FormattedText class with
        //     the specified text, culture, flow direction, typeface, font size, brush, and
        //     number substitution behavior.
        //
        // 参数:
        //   textToFormat:
        //     The text to be displayed.
        //
        //   culture:
        //     The specific culture of the text.
        //
        //   flowDirection:
        //     The direction the text is read.
        //
        //   typeface:
        //     The font family, weight, style and stretch the text should be formatted with.
        //
        //   emSize:
        //     The font size for the text's em measure, provided in device-independent units
        //     (1/96th inch per unit).
        //
        //   foreground:
        //     The brush used to paint the each glyph.
        //
        //   numberSubstitution:
        //     The number substitution behavior to apply to the text.
        [Obsolete("Use the PixelsPerDip override", false)]
        public FormattedText(string textToFormat, CultureInfo culture, FlowDirection flowDirection, Typeface typeface, double emSize, Brush foreground, NumberSubstitution numberSubstitution);
        //
        // 摘要:
        //     Initializes a new instance of the System.Windows.Media.FormattedText class with
        //     the specified text, culture, flow direction, typeface, font size, foreground
        //     brush, number substitution behavior, and pixelsPerDip value.
        //
        // 参数:
        //   textToFormat:
        //     The text to display.
        //
        //   culture:
        //     The specific culture of the text.
        //
        //   flowDirection:
        //     The direction the text is read.
        //
        //   typeface:
        //     The font family, weight, style and stretch the text should be formatted with.
        //
        //   emSize:
        //     The font size for the text's em measure, provided in device-independent units
        //     (1/96th inch per unit).
        //
        //   foreground:
        //     The brush used to paint the each glyph.
        //
        //   numberSubstitution:
        //     Specifies how numbers in text are displayed, based on System.Windows.Media.NumberSubstitution.
        //     This value can be null.
        //
        //   pixelsPerDip:
        //     The Pixels Per Density Independent Pixel value, which is the equivalent of the
        //     scale factor. For example, if the DPI of a screen is 120 (or 1.25 because 120/96
        //     = 1.25) , 1.25 pixel per density independent pixel is drawn. DIP is the unit
        //     of measurement used by WPF to be independent of device resolution and DPIs.
        public FormattedText(string textToFormat, CultureInfo culture, FlowDirection flowDirection, Typeface typeface, double emSize, Brush foreground, NumberSubstitution numberSubstitution, double pixelsPerDip);
        //
        // 摘要:
        //     Initializes a new instance of the System.Windows.Media.FormattedText class with
        //     the specified text, culture, flow direction, typeface, font size, brush, number
        //     substitution behavior, and text formatting mode.
        //
        // 参数:
        //   textToFormat:
        //     The text to be displayed.
        //
        //   culture:
        //     The specific culture of the text.
        //
        //   flowDirection:
        //     The direction the text is read.
        //
        //   typeface:
        //     The font family, weight, style and stretch the text should be formatted with.
        //
        //   emSize:
        //     The font size for the text's em measure, provided in device-independent units
        //     (1/96th inch per unit).
        //
        //   foreground:
        //     The brush used to paint the each glyph.
        //
        //   numberSubstitution:
        //     The number substitution behavior to apply to the text.
        //
        //   textFormattingMode:
        //     The System.Windows.Media.TextFormattingMode to apply to the text.
        [Obsolete("Use the PixelsPerDip override", false)]
        public FormattedText(string textToFormat, CultureInfo culture, FlowDirection flowDirection, Typeface typeface, double emSize, Brush foreground, NumberSubstitution numberSubstitution, TextFormattingMode textFormattingMode);
        //
        // 摘要:
        //     Initializes a new instance of the System.Windows.Media.FormattedText class with
        //     the specified text, culture, flow direction, typeface, font size, foreground
        //     brush, number substitution behavior, and pixelsPerDip value.
        //
        // 参数:
        //   textToFormat:
        //     The text to display.
        //
        //   culture:
        //     The specific culture of the text.
        //
        //   flowDirection:
        //     The direction the text is read.
        //
        //   typeface:
        //     The font family, weight, style and stretch the text should be formatted with.
        //
        //   emSize:
        //     The font size for the text's em measure, provided in device-independent units
        //     (1/96th inch per unit).
        //
        //   foreground:
        //     he brush used to paint the each glyph.
        //
        //   numberSubstitution:
        //     Specifies how numbers in text are displayed, based on System.Windows.Media.NumberSubstitution.
        //     This value can be null.
        //
        //   textFormattingMode:
        //     The formatting mode that affects how WPF displays text.
        //
        //   pixelsPerDip:
        //     The Pixels Per Density Independent Pixel value, which is the equivalent of the
        //     scale factor. For example, if the DPI of a screen is 120 (or 1.25 because 120/96
        //     = 1.25) , 1.25 pixel per density independent pixel is drawn. DIP is the unit
        //     of measurement used by WPF to be independent of device resolution and DPIs.
        public FormattedText(string textToFormat, CultureInfo culture, FlowDirection flowDirection, Typeface typeface, double emSize, Brush foreground, NumberSubstitution numberSubstitution, TextFormattingMode textFormattingMode, double pixelsPerDip);

      

主要以下几个属性比较有意思:

  1. MaxTextWidth:设置了以后,文本自动换行
  2. Trimming:自动换行文本溢出的修整方式
    • CharacterEllipsis 1 在字符边界处修整文本。 将绘制省略号 (...) 来替代剩余的文本。
    • None 0 不修整文本。
    • WordEllipsis 2 在单词边界处修整文本。 将绘制省略号 (...) 来替代剩余的文本。
  3. Height:文本高度