Рисование FrameworkElement в другом FrameworkElement - PullRequest
1 голос
/ 01 апреля 2010
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);
    }
}

И в XAML:

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

Но индикатор не рисуется. Чего мне не хватает?

Ответы [ 2 ]

1 голос
/ 29 июля 2012

Вы пытались реализовать метод LogicalChildren?

protected override IEnumerator LogicalChildren
{
    get { return indicators.GetEnumerator(); }
}

У меня были всевозможные проблемы, когда я разрабатывал свой первый FrameworkElement.

После обширных исследований я в основном обнаружил, что есть ряд методов, которые вы должны иметь для переопределения, чтобы он хорошо играл с WPF.

0 голосов
/ 01 апреля 2010

Как минимум, вам нужно переопределить ArrangeOverride в VisualCue:

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

    return finalSize;
}

Значения в Rect, передаваемые дочерним элементам Indicator, зависят от потребностей вашего макета. Вы также должны переопределить MeasureOverride.

FrameworkElement.ArrangeOverride метод

Метод FrameworkElement.MeasureOverride

...