WPF Рисование визуалов с помощью экземпляра класса C#

Сегодня я начал играть с WPF и столкнулся с некоторыми проблемами, связанными с рисованием визуалов.

У меня есть класс с именем Prototype.cs, в основном все, что он делает, это рисует визуал в форме эллипса. Ничего сложного здесь нет.

class Prototype : FrameworkElement
{
    // A collection of all the visuals we are building.
    VisualCollection theVisuals;

    public Prototype()
    {
        theVisuals = new VisualCollection(this);
        theVisuals.Add(AddCircle());
    }

    private Visual AddCircle()
    {
        DrawingVisual drawingVisual = new DrawingVisual();
        // Retrieve the DrawingContext in order to create new drawing content.
        using (DrawingContext drawingContext = drawingVisual.RenderOpen())
        {
            // Create a circle and draw it in the DrawingContext.
            Rect rect = new Rect(new Point(160, 100), new Size(320, 80));
            drawingContext.DrawEllipse(Brushes.DarkBlue, null, new Point(70, 90), 40, 50);
        }
        return drawingVisual;
    }
}

Но это то, где я запутался. Я вызываю конструктор для этого класса через код xaml, что для меня очень ново. Это работает, как задумано, и elipse рисуется. Но я хотел бы иметь экземпляр моего класса, который я мог бы использовать позже в моей программе.

xamlCode

Если я сам удаляю код xaml и создаю экземпляр моего объекта, в моем окне ничего не рисуется. Даже если я предоставлю MainWindow в качестве параметра в качестве VisualParent для моей VisualCollection, он все равно не будет работать. Я хотел бы держать вещи под контролем, чтобы мне не нужно было создавать свою визуальную коллекцию в моем MainWindow.cs. Я думал о создании статического класса для обработки всех визуальных элементов, но нет ли более простого способа добиться этого?

Создание экземпляра класса-прототипа:

public MainWindow()
{
    Prototype pt = new Prototype(this);
    InitializeComponent();
}

Конструктор-прототип:

public Prototype(Visual parent)
{
     theVisuals = new VisualCollection(parent);
     theVisuals.Add(AddCircle());
 }  

1 ответ

Решение

Вы можете присвоить имя Prototype экземпляр создан в XAML

<Window ...>
    <custom:Prototype x:Name="prototype"/>
</Window>

а затем получить доступ к экземпляру в коде так:

public MainWindow()
{
    InitializeComponent();
    prototype.DoSomething();
}

Или вы создаете его в коде и присваиваете его Content имущество:

public MainWindow()
{
    InitializeComponent();
    var prototype = new Prototype();
    Content = prototype;
    prototype.DoSomething();
}
Другие вопросы по тегам