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

时间:2018-06-16 12:29:53

标签: c# wpf oop canvas

我正在寻找一种在画布上绘制简单形状的方法,其形状在另一个类ShapeManager中制作。此ShapeManager决定它是什么形状,并为来自ColorManager的颜色指定颜色。

我提前为长代码道歉,这是我的第一篇文章,我仍然只是学习C#和OOP。

画布窗口
一个带有画布的窗口(cvs_Drawing)。应放置从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
创建CanvasWindows并提供CanvasWindow和ShapeManager之间的交互。多个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 创建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;
        }

    }

颜色管理软件 创建在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。我不能在画布上创建一个形状,每次点击画布时总是得到一个NullReference。

1 个答案:

答案 0 :(得分:0)

您的代码在此处有错误

public CanvasManager(){ ShapeManager = new ShapeManager(MainWindow); }
// CanvasManager.cs , Line 33

您通过MainWindow,即null

它来自这里

        public CanvasManager CanvasManager { get; set; } = new CanvasManager();
 // CanvasWindow.xaml.cs, Line 28

您可以像这样更正您的代码:

// 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);