tags:

views:

42

answers:

1

Hello I have this code:

public class VisualCue : FrameworkElement
 {
  public List<Indicator> Indicators { get; set; }

  public VisualCue()
  {
   this.Indicators = new List<Indicator>();
  }

  protected override int VisualChildrenCount
  {
   get
   {
    return this.Indicators.Count;
   }
  }

  protected override Visual GetVisualChild(int index)
  {
   return this.Indicators[index];
  }
 }

 public class Indicator : FrameworkElement
 {
  protected override void OnRender(DrawingContext context)
  {
   context.DrawEllipse(Brushes.Red, new Pen(Brushes.Black, 2), new Point(0, 0), 10, 10);

   base.OnRender(context);
  }
 }

And in XAML:

<local:VisualCue x:Name="visualCue">
 <local:VisualCue.Indicators>
  <local:Indicator />
 </local:VisualCue.Indicators>
</local:VisualCue>

But the indicator doesn't get drawn. What am I missing?

A: 

At the very least you need to override ArrangeOverride in VisualCue:

    protected override Size ArrangeOverride(Size finalSize)
    {
        foreach (Indicator indicator in Indicators)
        {
            indicator.Arrange(new Rect(0, 0, 10, 10));
        }

        return finalSize;
    }

The values in the Rect passed to Indicator children depends on your layout needs. You should also override MeasureOverride as well.

http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.arrangeoverride%28VS.95%29.aspx

http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.measureoverride.aspx

Scott J