【问题标题】:How can I serialize wpf user control with xaml and code behind如何使用 xaml 和代码序列化 wpf 用户控件
【发布时间】:2011-08-03 05:26:40
【问题描述】:

我想序列化 wpf 用户控件 xaml 和代码隐藏。 XamlWriter.Save() 仅序列化的 xaml 那么在这种情况下我该怎么办?我的情况是我有一个用户控件,其中包括自定义方法、订阅事件(例如:按钮单击)当我反序列化用户控件(用于在运行时创建用户控件)时,我想运行该事件和方法。对不起,我的英语不是很好。

【问题讨论】:

  • 为什么要序列化代码?
  • 您能解释一下为什么要这样做吗?不能用Reflector来获取C#代码吗?
  • 因为我会在运行时创建用户控件。例如;用户控件中的按钮在反序列化用户控件时具有单击事件(订阅)我想运行该事件。

标签: c# wpf serialization user-controls


【解决方案1】:

只是一个想法,您可以使用 MEF 为您的用户控件构建一个插件结构。您想动态创建用户控件,但事件处理程序仍应在项目的其他地方硬编码;使用插件结构,您可以只收集插件并重复使用它;事件可以通过命令来处理。也许给一个场景,我们可以弄清楚更多细节。

另外,ISerializable 提供了一种自定义二进制序列化字段的方法,而不是方法或事件。这是一个相关的问题: What is the point of the ISerializable interface? ;另一方面,您仍然可以尝试一些模式,例如 Web 控件如何保存其视图状态;例如 两个虚方法:

public virtual byte[] SaveState(); // it saves the states for your custom control
public virtual void LoadState(byte[] state) // it restore your state back to the control.

自定义代码应该是这样的:

byte[] state = controlA.SaveState(); // this method saves its own state.
YourControl controlB = new YourControl();
controlB.LoadState(state); // this method load the save state from A to B itself.

对于事件,每个事件都有一个处理程序名称,您也可以将其处理程序名称序列化为状态,并通过保存的名称从其命名容器中找到它。我没有任何保存方法的经验。

如果您仍想保存和加载状态,包括字段、事件和方法,我认为序列化可能不是您正在寻找的正确方式。

【讨论】:

  • UserControl 继承 ISerializable 接口。我序列化和反序列化用户控件而不会丢失任何成员、事件、方法。我可以解释一下,因为我的英语不是很好
  • 不客气,希望对您有所帮助。我们曾经找了很长时间的序列化解决方案,但没有一个是 100% 完美的。 :)
猜你喜欢
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多