Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以将控件(面板)存储为对象,将其序列化并存储为文件?_C#_Serialization_Compact Framework_Makefile - Fatal编程技术网

C# 是否可以将控件(面板)存储为对象,将其序列化并存储为文件?

C# 是否可以将控件(面板)存储为对象,将其序列化并存储为文件?,c#,serialization,compact-framework,makefile,C#,Serialization,Compact Framework,Makefile,这个话题说明了一切 使用紧凑框架C# 我正在将从url下载的一些图像平铺(顺序/顺序很重要)到一个面板中(每个图像都是一个PictureBox)。 这可能是一个巨大的过程,可能需要一些时间 因此,我只希望用户下载图像并平铺一次。因此,用户下次使用平铺应用程序时,第一次创建的面板已存储在文件中,并从该文件加载 所以我想要的是一种将面板存储为文件的方法 这是可能的,还是你认为我应该用另一种方式 我试过这样的方法: BinaryWriter panelStorage = new

这个话题说明了一切

使用紧凑框架C#

我正在将从url下载的一些图像平铺(顺序/顺序很重要)到一个面板中(每个图像都是一个PictureBox)。 这可能是一个巨大的过程,可能需要一些时间

因此,我只希望用户下载图像并平铺一次。因此,用户下次使用平铺应用程序时,第一次创建的面板已存储在文件中,并从该文件加载

所以我想要的是一种将面板存储为文件的方法

这是可能的,还是你认为我应该用另一种方式

我试过这样的方法:

            BinaryWriter panelStorage = new BinaryWriter(new FileStream("imagePanel.panel", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None));
            Byte[] bImageObject = new Byte[20000];
            bImageObject = (byte[])(object)this.imagePanel;
            panelStorage .Write(bMapObject);
            panelStorage .Close();
但演员阵容并不十分合法:p

“无效卡斯特例外”

有人能帮我解决这个问题吗


提前谢谢你

是的,您的代码将抛出,您无法将控件对象强制转换为字节[]。这种转换需要序列化,由BinaryFormatter执行。问题是:控制类及其派生类不可序列化,它们没有[serializable]属性

控件类是一个复杂的母类,它有数百个私有字段。这些字段中的许多字段的值是在运行时生成的,通常是通过与本机Windows窗口的互操作生成的。虽然序列化它们在某种程度上是可能的,但反序列化不是。重建控件对象也需要重建本机窗口。它本身有很多状态,这种状态是通过向它发送一系列消息来设置的。重新生成这些消息并不实际

这不会给你留下很多有吸引力的选择。序列化UI是可能的,Windows窗体设计器和WPF XAML可以做到这一点。但是这些都是非常大的代码块,不容易嵌入到程序中


目标较低,不要尝试序列化整个控件。只有它的一些属性,如大小和位置,您将有机会实现这一点。

ResX文件序列化控件的几个属性。也许您可以使用这些?

如果我是您,我不会序列化控件。相反,我将序列化进入控件的数据。有几个原因

首先,它更容易。您可以获取您要放入的任何数据(图像),并将它们放入自定义MyPanel类或其他任何类型。在其中存储关于如何操作它们的信息,然后您可以序列化该类,就完成了


第二个原因是,如果您想在以后更改数据的显示或使用方式,您有更多的自由。您可以以其他方式使用它,也可以与其他应用程序和控件一起使用,而无需您付出任何实际努力。

我曾想过这样做,但似乎在面板中插入图片盒需要电源。我只有PictureBox,没有图像,需要一些时间才能将它们加载到面板中。是不是因为我插入了图片盒,所以面板的宽度和高度都可以超过9000px?无论如何,我会试试你的方法。谢谢如果你能更详细地解释一下你想做什么,我们也许能提供更好的建议。如果您有多个picturebox控件,那么问题就出在这里。进行大量图形操作时,最好使用GDI——也就是说,您有一个picturebox(或者您可以使用面板)作为绘图表面,并使用表单的OnPaint方法直接绘制到它。这是相当快。我有一个大的图像,我已经平铺成许多较小的图像。(这是在服务器端完成的)。我想在windows mobile上显示整个图像,我的想法是这样的:如果图像是4x4瓷砖:-我需要在其周围使用假瓷砖(我称它们为墙砖,因为它们围绕整个图像),这样用户就可以在图片上移动(当用户在屏幕上触摸和拖动时,通过设置滚动条位置完成移动)-我需要面板在屏幕外面一点,这样滚动条就不可见了。-如果我不在面板上放置任何元素,面板就不会自行调整大小,这就是为什么我在面板上省略了绘图。下面是一个关于我的平铺方式的示例:每个picturebox是256x256px,因此屏幕一次只能显示2或3个平铺。(计划是在用户沿着面板移动时加载图像)。但是面板需要调整大小,以便滚动条“出现”,并且创建墙砖并“可触摸”我将对此进行研究,但我怀疑这是否比创建一个类并序列化该类更有帮助。感谢您提供的描述和深入的信息!我将尝试使用属性和图像序列化该类。谢谢您的回答:)