主题说明了一切。
使用Compact Framework C#
我正在平铺(顺序/序列很重要)我从网址下载到Panel中的一些图像(每个图像都是PictureBox)。 这可能是一个巨大的过程,可能需要一些时间。
因此我只希望用户下载图像并将其平铺一次。因此,下次用户使用Tile应用程序时,第一次创建的Panel已存储在文件中,并从该文件加载。
所以我想要的是一种将Panel存储为文件的方法。
这可能,或者你认为我应该采取另一种方式吗?
我尝试过这样的事情:
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
“InvalidCastException的”
任何人都可以帮我解决这个问题吗?
提前谢谢!
答案 0 :(得分:1)
是的,您的代码将抛出,您无法将Control对象强制转换为byte []。这种转换需要序列化,BinaryFormatter执行的那种。麻烦是:Control类及其后代不可序列化,它们没有[Serializable]属性。
Control类是一个复杂的母亲,它有数百个私有字段。许多这些字段具有在运行时生成的值,通常通过与本机Windows窗口进行互操作。虽然序列化它们有些可能,但反序列化却不是。重建Control对象也需要重建本机窗口。并且它有一个 lot 状态本身,通过发送一堆消息来设置它。重新生成这些消息是不切实际的。
这并没有给你留下很多有吸引力的选择。可以序列化UI,Windows窗体设计器和WPF XAML可以实现。但这些非常大块代码,不容易嵌入到您的程序中。
目标较低,不要尝试序列化整个控件。只是它的一些属性,如大小和位置,你将有机会使这项工作。
答案 1 :(得分:1)
如果我是你,我不会将控件序列化。相反,我会将进入控件的数据序列化。有几个原因。
首先,它更容易。您可以获取您放入的任何数据(图像)并将它们放入自定义MyPanel类或其他任何内容中。存储有关如何操作它们的信息,然后您可以序列化该类,并且已完成。
第二个原因是,如果您想要更改数据在以后显示或使用的方式,您可以获得更多自由。您可以通过其他方式使用它,或者与其他应用程序和控件一起使用,而无需您做任何实际操作。
答案 2 :(得分:0)
ResX文件序列化控件的几个属性。也许你可以使用那些?