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 рисуется. Но я хотел бы иметь экземпляр моего класса, который я мог бы использовать позже в моей программе.
Если я сам удаляю код 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();
}