Можно ли сохранить элементы управления (Panel) как объект, сериализовать его и сохранить как файл? - PullRequest
0 голосов
/ 31 марта 2010

В теме все сказано.

Использование Compact Framework C #

Я делаю плитки (порядок / последовательность важны), некоторые изображения, которые я загружаю из URL, в Panel (каждое изображение - PictureBox). Это может быть огромный процесс, и может занять некоторое время.

Поэтому я хочу, чтобы пользователь загружал изображения и размещал их один раз. Поэтому в следующий раз, когда пользователь использует приложение Tile, панель, созданная в первый раз, уже сохраняется в файле и загружается из этого файла.

Так что мне нужен способ сохранить 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"

Может кто-нибудь помочь мне с этой проблемой?

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 31 марта 2010

Я бы не стал сериализовать управление на твоем месте. Вместо этого я бы сериализовал данные, которые поступают в элемент управления. Есть несколько причин.

Во-первых, это проще. Вы можете взять любые данные, которые вы вводите (изображения), и поместить их в пользовательский класс MyPanel или что угодно. Там также хранится информация о том, как ими манипулируют, и затем вы можете сериализовать этот класс, и все готово.

Вторая причина заключается в том, что если вы хотите изменить способ отображения или использования данных на более позднем этапе, у вас гораздо больше свободы. Вы можете использовать его другими способами или с другими приложениями и средствами управления без каких-либо реальных усилий с вашей стороны.

1 голос
/ 31 марта 2010

Да, ваш код будет выдан, вы не можете привести объект Control к байту []. Этот тип преобразования требует сериализации, такой как BinaryFormatter. Проблема в том, что класс Control и его потомки не сериализуемы, у них нет атрибута [Serializable].

Класс Control - сложная мать, в ней сотни закрытых полей. Многие из этих полей имеют значения, которые генерируются во время выполнения, часто путем взаимодействия с собственным окном Windows. Хотя их сериализация в некоторой степени возможна, десериализация - нет. Реконструкция объекта Control также требует реконструкции собственного окна. И у него есть много самого состояния, типа, который устанавливается, посылая ему кучу сообщений. Регенерация этих сообщений нецелесообразна.

Это не оставляет вам много привлекательных вариантов. Возможна сериализация пользовательского интерфейса, это делает дизайнер Windows Forms и WPF XAML. Но это очень больших кусков кода, которые нелегко встроить в вашу программу.

Цель ниже, не пытайтесь сериализовать весь контроль. Только некоторые из его свойств, такие как Размер и Расположение, и у вас будет шанс сделать эту работу.

0 голосов
/ 31 марта 2010

Файлы ResX сериализуют несколько свойств элемента управления. Возможно, вы можете использовать их?

...