首页 > 解决方案 > C# - 将形状从文本文件加载到 PictureBox 中,其中包含描述每个形状的数据

问题描述

我有完美的工作代码来加载和保存包含形状类型的文本文件中的形状(我使用称为 shapetype 的枚举)、x1、y1(初始鼠标按下位置)坐标和 x2、y2(最终位置一旦鼠标被拖动到某处并释放左键,鼠标光标)。该数据还将形状的颜色存储为一个 rgb int 和一个真/假值,以判断该形状是填充为实心还是只是轮廓。

我唯一要问的是,我如何才能拥有完全相同的东西,但在我的文本文件的一行上的 1 个形状的所有数据仍然能够加载它。我知道如何在一行上保存数据,但我不知道如果每个形状的所有内容都在一行上,我将如何加载数据......

现在的代码是:

   private void loadCanvas(List<APShape> shapeList)
        {
            shapeList.Clear();
            string line = "";
            OpenFileDialog open = new OpenFileDialog();
            open.Filter = "Shape Data Files | *.shapes";
            if (open.ShowDialog() == DialogResult.OK)
            {
                Stream s = File.Open(open.FileName, FileMode.Open);
                StreamReader sr = new StreamReader(s);
                while (line != null)
                {
                    line = sr.ReadLine();
                    if (line != null)
                    {
                        shapeList.Add(ObjectFromTxt(line));
                        shapeList[shapeList.Count - 1].setColor(Color.FromArgb(int.Parse(sr.ReadLine())));
                        shapeList[shapeList.Count - 1].setX1(int.Parse(sr.ReadLine()));
                        shapeList[shapeList.Count - 1].setY1(int.Parse(sr.ReadLine()));
                        shapeList[shapeList.Count - 1].setX2(int.Parse(sr.ReadLine()));
                        shapeList[shapeList.Count - 1].setY2(int.Parse(sr.ReadLine()));
                        shapeList[shapeList.Count - 1].setSolid(string2bool(sr.ReadLine()));
                        shapeList[shapeList.Count - 1].setPenWidth(float.Parse(sr.ReadLine()));

                    }
                }
                sr.Close();
                canvas.Invalidate();
            }
        }

包含形状数据的文本文件的外观是: 当前文件格式

标签: c#stringlistfile

解决方案


最终结果

  private void saveCanvas()
        {
            SaveFileDialog save = new SaveFileDialog();
            save.DefaultExt = ".shapes";
            save.Filter = "Shapes File (*.shapes) |*.shapes";

            if (save.ShowDialog() == DialogResult.OK)
            {
                File.Delete(save.FileName);
                var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects, NullValueHandling = NullValueHandling.Ignore };
                File.WriteAllText(save.FileName, JsonConvert.SerializeObject(shapes, shapes.GetType(), settings));
            }
        }


        private void loadCanvas()
        {
            List<APShape> shapeList = new List<APShape>();
            OpenFileDialog open = new OpenFileDialog();
            open.Filter = "Shapes File (*.shapes) |*.shapes";

            if (open.ShowDialog() == DialogResult.OK)
            {
                shapes.Clear();       /* Clear canvas to make sure we are starting blank */
                canvas.Invalidate();

                var json = File.ReadAllText(open.FileName);
                var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects, NullValueHandling = NullValueHandling.Ignore };

                shapeList = JsonConvert.DeserializeObject<List<APShape>>(json, settings);

                foreach (var shape in shapeList)
                {
                    shapes.Add(shape);
                }
                canvas.Invalidate();      
            }
    }

推荐阅读