1
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>

しかし、インジケーターは描画されません。私は何が欠けていますか?

4

2 に答える 2

1

メソッドを実装してみましたLogicalChildrenか?

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

初めて「FrameworkElement」を開発したときは、いろいろと苦労しました。

広範な調査の結果、私は基本的に、それがうまく機能するためにオーバーライドする必要がある多くのメソッドがあることを発見しましWPF

于 2012-07-29T19:51:50.307 に答える
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 メソッド

FrameworkElement.MeasureOverride メソッド

于 2010-03-31T22:56:56.347 に答える