[英]Draw a shape on a canvas in a new window C#
I am looking for a way to draw a simple shape on a canvas with the shape being made in another class ShapeManager. 我正在寻找一种在画布上绘制简单形状的方法,该形状是在另一个类ShapeManager中制成的。 This ShapeManager decides what shape it is and assigns a color to it coming from ColorManager.
此ShapeManager决定它是什么形状,并为它指定来自ColorManager的颜色。
I apologize in advance for the long code, this is my first post and I am still just learning C# and OOP in general. 我为长代码事先表示歉意,这是我的第一篇文章,并且我仍然只是在总体上学习C#和OOP。
Canvas Window 帆布窗
A window with a canvas on it (cvs_Drawing). 一个带有画布的窗口(cvs_Drawing)。 Should place a shape it gets from CanvasManager.ShapeManager.CreateNewShape(), but throws a NullReference.
应该放置它从CanvasManager.ShapeManager.CreateNewShape()获取的形状,但会引发NullReference。
public partial class CanvasWindow : Window
{
public string CanvasName { get; set; }
public CanvasManager CanvasManager { get; set; }
public CanvasWindow(string name)
{
InitializeComponent();
CanvasManager= new CanvasManager();
CanvasName = name;
this.Title = CanvasName;
}
//Click event to draw the chosen shape on canvas
private void cvs_Drawing_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
try
{
Shape shapeDrawing = CanvasManager.ShapeManager.CreateNewShape();
Point location = e.GetPosition(cvs_Drawing);
Canvas.SetTop(shapeDrawing, location.Y);
Canvas.SetLeft(shapeDrawing, location.X);
cvs_Drawing.Children.Add(shapeDrawing);
}
//catch block here
CanvasManager 画布管理器
Creates CanvasWindows and provides interaction between CanvasWindow and ShapeManager. 创建CanvasWindows并提供CanvasWindow和ShapeManager之间的交互。 Multiple CanvasWindows is normally a possibility.
通常可以使用多个CanvasWindows。
public CanvasWindow CanvasWindow { get; set; }
public MainWindow MainWindow { get; set; }
public ShapeManager ShapeManager { get; set; }
//Constructors
public CanvasManager(MainWindow w)
{
MainWindow = w;
ShapeManager = new ShapeManager(w);
}
public CanvasManager() { }
//Add a brand new canvas
public CanvasWindow CreateNewCanvas(string name)
{
CanvasWindow = new CanvasWindow(name);
return CanvasWindow;
}
ShapeManager Creates Shapes needed for CanvasWindow ShapeManager创建CanvasWindow所需的形状
public MainWindow Window { get; set; }
public Shape NewShape { get; set; }
public ColorManager ColorManager { get; set; }
public List<string> ListShapes { get; set; } = new List<string>();
public ShapeManager(MainWindow w)
{
Window = w;
ListShapes.Add("Ellipse");
ListShapes.Add("Rectangle");
ColorManager = new ColorManager();
}
public ShapeManager() { }
#region Shape Creation
public Shape CreateNewShape()
{
Color newShapeColor = ColorManager.CreateNewColor();
if (Window.cb_Shapes.SelectedItem.ToString() == "Ellipse")
{
NewShape = new Ellipse
{
Width = Int32.Parse(Window.tb_Width.Text),
Height = Int32.Parse(Window.tb_Height.Text),
Fill = new SolidColorBrush(newShapeColor)
};
return NewShape;
}
else
{
NewShape = new Rectangle
{
Width = Int32.Parse(Window.tb_Width.Text),
Height = Int32.Parse(Window.tb_Height.Text),
Fill = new SolidColorBrush(newShapeColor)
};
return NewShape;
}
}
ColorManager Creates the color for the shape that was created in ShapeManager. ColorManager为在ShapeManager中创建的形状创建颜色。
public MainWindow Window { get; set; }
public Color NewColor { get; set; }
//Constructors
public ColorManager(MainWindow w)
{
Window = w;
}
//public ColorManager(){}
//Add new color method
public Color CreateNewColor()
{
NewColor = new Color
{
A = 255,
R = Byte.Parse(Window.tb_RedValue.Text),
G = Byte.Parse(Window.tb_GreenValue.Text),
B = Byte.Parse(Window.tb_BlueValue.Text)
};
return NewColor;
}
TL;DR. TL; DR。 I can't create a shape on the canvas, always get a NullReference every time I click on the canvas.
我无法在画布上创建形状,每次单击画布时始终获得NullReference。
Your code has an error here 您的代码在这里有错误
public CanvasManager(){ ShapeManager = new ShapeManager(MainWindow); }
// CanvasManager.cs , Line 33
you passed MainWindow
, which is null
您通过了
MainWindow
,它为null
and it comes from here 它来自这里
public CanvasManager CanvasManager { get; set; } = new CanvasManager();
// CanvasWindow.xaml.cs, Line 28
You can correct your code like this: 您可以像这样更正您的代码:
// in CanvasWindow.xaml.cs, Line 28
public CanvasWindow(string name, MainWindow mainWindow)
{
InitializeComponent();
**CanvasManager = new CanvasManager(mainWindow);**
CanvasName = name;
//ShapeManager = new ShapeManager();
this.Title = CanvasName;
...
...
...
// NewDrawingWindow.xaml.cs, Line 47
CanvasWindow canvasWindow = new CanvasWindow(tb_Drawing_Name.Text, Window);
// CanvasManager.cs, Line 38
CanvasWindow = new CanvasWindow(name, MainWindow);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.