簡體   English   中英

在新窗口中的C#畫布上繪制形狀

[英]Draw a shape on a canvas in a new window C#

我正在尋找一種在畫布上繪制簡單形狀的方法,該形狀是在另一個類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

畫布管理器
創建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;
        }

    }

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。 我無法在畫布上創建形狀,每次單擊畫布時始終獲得NullReference。

您的代碼在這里有錯誤

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM