在另一个FrameworkElement中绘制FrameworkElement

时间:2010-03-31 21:03:59

标签: wpf drawing frameworkelement

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 个答案:

答案 0 :(得分:1)

您是否尝试过实施LogicalChildren方法?

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

当我开发第一个'FrameworkElement`时,我遇到了各种各样的麻烦。

经过广泛的研究后,我基本上发现有很多方法可以覆盖 ,以便与WPF很好地配合。

答案 1 :(得分:0)

至少你需要在VisualCue中覆盖ArrangeOverride:

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

    return finalSize;
}

传递给Indicator子节点的Rect中的值取决于您的布局需求。您还应该覆盖MeasureOverride。

FrameworkElement.ArrangeOverride method

FrameworkElement.MeasureOverride method

相关问题