Сериализация UserControl в Silverlight - PullRequest
0 голосов
/ 24 декабря 2011

Я хочу сериализовать UserControl в Silverlight. Все, что я хочу сделать, это «глубокое копирование». Я пробовал этот код, который не работает:

using System.Windows;
using System.Windows.Controls;
using System.Runtime.Serialization;
using System.IO;

namespace SilverlightApplication1
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
            this.Loaded += new RoutedEventHandler(MainPage_Loaded);
        }

        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            DataContractSerializer serializer = new DataContractSerializer(typeof(UserControl));
            using (MemoryStream ms = new MemoryStream())
            {
                serializer.WriteObject(ms, this);
            }
        }
    }
}

Я получаю это исключение:

Type 'System.Windows.UIElement' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute. Alternatively, you can ensure that the type is public and has a parameterless constructor - all public members of the type will then be serialized, and no attributes will be required.

Как мне избавиться от этого исключения?

Очевидный вопрос, который вы хотели бы задать, - зачем мне сериализовать UserControl? Причина, я пытаюсь использовать Печать API Silverlight. Я создаю WriteableBitmap из моего UserControl, а затем пытаюсь распечатать его. Однако мой UserControl имеет черную тему, но при печати она должна быть белой. Если я напрямую изменю «Фон» в UserControl, это повлияет на мое изображение на экране, а это не то, что я хочу! Поэтому я пытаюсь создать клон пользовательского контроля в памяти, а затем изменить его фон за кулисами, создать из него WriteableBitmap и распечатать его. Однако не повезло до сих пор!

Ответы [ 2 ]

0 голосов
/ 24 декабря 2011

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

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

0 голосов
/ 24 декабря 2011

Лучшим способом было бы привязать ваш пользовательский контроль к сериализуемому объекту.

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

...