【问题标题】:Serializing MDI Winforms for persistency序列化 MDI Winform 以实现持久性
【发布时间】:2011-02-19 17:21:52
【问题描述】:

基本上我的项目是一个 MDI Winform 应用程序,用户可以通过添加各种控件和更改布局来自定义界面。我希望能够为每个用户保存应用程序的状态。

我做了很多搜索,找到了这些:

How to auto save and auto load all properties in winforms C#?

Save WinForm or Controls to File

据我所知,最好的方法是将数据序列化为 XML,但是 winform 控件不可序列化,所以我会使用代理类:

http://www.codeproject.com/KB/dotnet/Surrogate_Serialization.aspx

现在,我需要为每个控件编写一个代理类吗?我需要编写某种递归算法来保存我的所有控件,实现这一目标的最佳方法是什么?然后我将如何恢复所有的窗口,我应该使用 memento 设计模式吗?如果我以后想实现多个用户,我应该使用 Nhibernate 将所有对象数据存储在数据库中吗?我仍在努力解决这个问题,如果有人有任何经验或建议,我将不胜感激,谢谢

【问题讨论】:

  • 表单和控件可以正常工作,我只是想让它持久化。
  • 还有表单设置选项,但事实证明它对于我正在使用的控件来说不够健壮。

标签: c# .net xml winforms serialization


【解决方案1】:

您不想序列化实际的控件实例。它们应该与它们所在的Form 一起创建和销毁。而是看看你让用户自定义什么。布局和位置?很好,保存每个控件的顶部和左侧坐标以及控件标识符。你让用户添加新控件吗?将它们的 id 与类型标识符一起保存,以便在重新加载时可以在其先前位置重新创建控件。

无论您使用 XML 还是其他格式,都没有最佳方法或最佳实践,请选择对您的项目有意义的方式。 XML 恰好是一种易于使用的格式,在 .Net 框架中得到了很好的支持。

【讨论】:

  • 我也是这么想的,我只是想弄清楚如何最好地实现它。我是否需要创建一个对象来存储我要序列化的这些属性?遍历表单以捕获所有控件及其属性的最佳方法是什么?
  • 迭代 Form.Controls 并在迭代时写出它们的属性。恢复状态类似,但如果您支持添加新控件,则需要做更多工作。
【解决方案2】:

我知道有一个软件,LinsUI Layout Manager,可以很好的处理你的问题。他们为感兴趣的开发人员提供免费版本。 You can check the site。 加油

【讨论】: