By this point, you've probably realized the fundamental truth of WPF printing. You can use the quick-and-dirty techniques described in the previous section to send content from a window to your printer and even tweak it a bit. But if you want to build a first-rate printing feature for your application, you'll need to design it yourself.
The best way to construct a custom printout is to use the visual-layer classes. Two classes are particularly useful:
ContainerVisual is a stripped-down visual that can hold a collection of one or more other Visual objects (in its Children collection).
DrawingVisual derives from ContainerVisual and adds a RenderOpen() method and a Drawing property. The RenderOpen() ...