Добавление VisualChild в Canvas не работает - не отображается - PullRequest
0 голосов
/ 26 марта 2012

Мне нужно написать класс, который наследуется от Canvas и который может добавлять визуалы в базу данных canvas.

Итак, я написал этот код:

class TestCanvas : Canvas
{
    VisualCollection visuals;

    public TestCanvas()
    {
        visuals = new VisualCollection(this);
    }

    protected override void OnMouseDown(MouseButtonEventArgs e)
    {
        Rectangle rect = new Rectangle
        {
            Width = 200,
            Height = 200,
            Stroke = Brushes.Red,
            StrokeThickness = 5,
            Fill = Brushes.Black
        };
        visuals.Add(rect);
        base.OnMouseDown(e);
    }

    protected override int VisualChildrenCount
    {
        get
        {
            return visuals.Count;
        }
    }

    protected override Visual GetVisualChild(int index)
    {
        if (index < 0 || index > visuals.Count)
            throw new ArgumentOutOfRangeException("index");

        return visuals[index];
    }
}

Но если я нажму на него и добавлю этот прямоугольник, он не отображается. Так у кого-нибудь есть идея, почему это не работает?

1 Ответ

2 голосов
/ 27 марта 2012

Если вы хотите программно добавлять дочерние элементы в производный Canvas, вы можете просто сделать это следующим образом:

Rectangle rect = new Rectangle   
{   
    Width = 200,   
    Height = 200,   
    Stroke = Brushes.Red,   
    StrokeThickness = 5,   
    Fill = Brushes.Black   
};   

Canvas.SetLeft(rect, ...);
Canvas.SetTop(rect, ...);

Children.Add(rect);

Нет необходимости переходить на уровень Visual и переопределять VisualChildrenCount и GetVisualChild.

Если по какой-либо другой причине вам необходимо использовать Visuals, тогда нет необходимости использовать Canvas. Вы можете получить от UIElement или FrameworkElement.

...