我想在Silverlight中序列化UserControl。我想做的就是“深度复制”。我尝试了这个不起作用的代码:
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?原因,我正在尝试使用Silverlight的Printing API。我正在从UserControl创建一个WriteableBitmap,然后尝试打印它。但是我的UserControl有黑色主题,但打印时它应该是白色的。如果我直接修改UserControl的“背景”,它将影响我在屏幕上的视觉效果,这不是我想要的!所以我试图在内存中创建一个usercontrol的克隆,然后在后台修改它的背景,并从中创建WriteableBitmap并打印它。但是直到现在都没有运气!
答案 0 :(得分:0)
最好的方法是将usercontrol绑定到可序列化的对象。
因此,不是序列化设计不受支持的用户控件,而是序列化自定义对象。
这也会产生更清晰,更小的序列化对象。
答案 1 :(得分:0)
我想这是不可能的。 Silverlight的很大一部分是本机代码。国家的很大一部分是在非管理的记忆中。因此,您将无法使用任何外部序列化程序来获取该状态。
唯一可行的方法是通过模板化视图模型来创建打印控件。如果您的模型保持UI的重要状态,则可以轻松创建控件克隆。然后根据需要设计它们。