简体   繁体   English

在新窗口中的C#画布上绘制形状

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM