Я хотел бы создать графический интерфейс с Visual Studio, который состоит в основном из дерева и холста. Функциональные возможности приложения изначально заключаются в создании несколько сложных форм на холсте, которые следует соединить позже для создания компактного блока (конечная цель не графическая, а представление функций и процедур). Более конкретно, пользователь мог бы с помощью выбора формы в древовидном представлении щелкнуть по холсту и соответствующей форме для рисования. У него также есть возможность перемещать фигуры на холсте и соединять их линиями. Становится очевидным, что приложение должно использовать расширенные возможности мышиных слушателей (mouseEvents).
Является ли wpf подходящим типом проекта для достижения чего-то подобного?
Учитывая, что эти фигуры не являются простыми, но содержат содержимое, другие фигуры, кнопки и mouseEvents, код, требуемый для их создания, не ограничен. Должно ли оно быть полностью в MainWindow.xaml.cs или было бы лучше направить разделение реализации на большее количество классов (например, один отдельный класс для каждой фигуры)? Например, код для прямоугольника пока:
Double rectWidth = 100;
Double rectHeight = rectWidth;
shapeToRender = new Rectangle() { Fill = Brushes.Red, Height = 100, Width = 100, RadiusX = 7, RadiusY = 7 };
shapeToRender.Stroke = Brushes.Black;
shapeToRender.StrokeThickness = 3;
currentShape = SelectedShape.Empty;
Canvas.SetLeft(shapeToRender, e.GetPosition(canvasDrawingArea).X - rectWidth / 2);
Canvas.SetTop(shapeToRender, e.GetPosition(canvasDrawingArea).Y - rectHeight / 2);
canvasDrawingArea.Children.Add(shapeToRender);
double xCircle1 = e.GetPosition(canvasDrawingArea).X + (rectWidth)/2;
double yCircle1 = e.GetPosition(canvasDrawingArea).Y + (rectHeight)/4;
double xCircle2 = xCircle1;
double yCircle2 = e.GetPosition(canvasDrawingArea).Y - (rectWidth) / 4;
double xCircle3 = e.GetPosition(canvasDrawingArea).X - rectWidth / 2;
double yCircle3 = e.GetPosition(canvasDrawingArea).Y;
Ellipse s1Ellipse = new Ellipse() { Fill = Brushes.Yellow, Height = 10, Width = 10 };
Canvas.SetLeft(s1Ellipse, xCircle1-5);
Canvas.SetTop(s1Ellipse, yCircle1-5);
canvasDrawingArea.Children.Add(s1Ellipse);
Ellipse s2Ellipse = new Ellipse() { Fill = Brushes.Yellow, Height = 10, Width = 10 };
Canvas.SetLeft(s2Ellipse, xCircle2-5);
Canvas.SetTop(s2Ellipse, yCircle2-5);
canvasDrawingArea.Children.Add(s2Ellipse);
Ellipse s3Ellipse = new Ellipse() { Fill = Brushes.Yellow, Height = 10, Width = 10 };
Canvas.SetLeft(s3Ellipse, xCircle3 - 5);
Canvas.SetTop(s3Ellipse, yCircle3 - 5);
canvasDrawingArea.Children.Add(s3Ellipse);
Разумно ли создавать отдельный класс, отвечающий за создание прямоугольников? Как тогда я могу манипулировать элементами MainWindow и mousEvents внутри нового класса?