Search code examples
c#wpfcanvasdrawingdrawingcontext

Display a DrawingVisual on Canvas


I have a drawing visual which I have drawings, how do I add this to my canvas and display?

 DrawingVisual drawingVisual = new DrawingVisual();

 // Retrieve the DrawingContext in order to create new drawing content.
 DrawingContext drawingContext = drawingVisual.RenderOpen();

 // Create a rectangle and draw it in the DrawingContext.
 Rect rect = new Rect(new System.Windows.Point(0, 0), new System.Windows.Size(100, 100));
 drawingContext.DrawRectangle(System.Windows.Media.Brushes.Aqua, (System.Windows.Media.Pen)null, rect);

 // Persist the drawing content.
 drawingContext.Close();

How do I add this to a canvas? Suppose I have a Canvas as

  Canvas canvas = null;
  canvas.Children.Add(drawingVisual); //Doesnt work as UIElement expected.

How do I add my drawingVisual to canvas?

TIA.


Solution

  • You have to implement a host element class, which would have to override the VisualChildrenCount property and the GetVisualChild() method of a derived UIElement or FrameworkElement to return your DrawingVisual.

    The most basic implementation could look like this:

    public class VisualHost : UIElement
    {
        public Visual Visual { get; set; }
    
        protected override int VisualChildrenCount
        {
            get { return Visual != null ? 1 : 0; }
        }
    
        protected override Visual GetVisualChild(int index)
        {
            return Visual;
        }
    }
    

    Now you would add a Visual to your Canvas like this:

    canvas.Children.Add(new VisualHost { Visual = drawingVisual });