【问题标题】:Draw a shape on a canvas in a new window C#在新窗口中的画布上绘制形状 C#
【发布时间】:2018-06-16 12:29:53
【问题描述】:

我正在寻找一种在画布上绘制简单形状的方法,该形状是在另一个类 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
创建 CanvasWindow 并提供 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;
    }

形状管理器 创建 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;博士。我无法在画布上创建形状,每次单击画布时总是得到 NullReference。

【问题讨论】:

  • 能否请您发送一个示例,一个可以检查或调试的完整项目?

标签: c# wpf oop canvas


【解决方案1】:

您的代码在这里有错误

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

【讨论】:

  • 我明白了。因为我正在运行这个构造函数而没有任何对 MainWindow 的引用,所以它保持为空。您对如何解决此问题或以不同/更好的方式解决此问题有什么建议吗?
  • 我编辑了我的答案并添加了一些代码来解决这个问题,顺便说一句,我无权在 github 中提交更改,但您可以将它们应用到您的代码并检查它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 1970-01-01
相关资源
最近更新 更多