2011-12-24 2 views
0

Я хочу Сериализовать UserControl в Silverlight. Все, что я хочу сделать, это «глубокое копирование». Я попробовал этот код, который не работает:Сериализация 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 и распечатать его. Но пока не повезло!

+0

Вы ... попытались выполнить инструкции, приведенные в сообщении об исключении? –

+0

Как я могу это сделать? UIElement все присутствуют в DLL. Как я могу пометить их Serializable? – TCM

+0

Вы можете отметить свой класс как Serializable, он не обязательно должен быть базовым объектом. –

ответ

0

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

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

Это также приведет к более чистому и меньшему сериализованному объекту.

0

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

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

+0

Я не могу найти XamlWriter. XamlReader - единственный, который я могу найти. Я что-то упускаю? – TCM

+0

К сожалению, он не поддерживается. Я должен был проверить. –

+0

Есть пользовательский XamlWriter, google it. – alexkovelsky

Смежные вопросы