【问题标题】:How do I serialize a .NET control to CODE?如何将 .NET 控件序列化为 CODE?
【发布时间】:2010-02-09 21:38:23
【问题描述】:

我想在运行时创建一个 .NET 表单,向其中添加按钮和其他控件(也在运行时),然后能够从该表单生成 something.designer.cs 文件(然后可以将其添加到一个 C# 解决方案并编译)。

我想做的和 WinForm 设计器做的很相似。但是我不想为用户提供拖放界面,而是想在运行时自己动态构建表单/控件。

我在想我可以重用 WinForm 设计器正在做的事情。

这可能吗?

【问题讨论】:

  • 由于这个问题,我的大脑正在遭受递归
  • 不清楚你想要什么。试着举一个具体的例子来说明你是如何看待这个工作的。
  • 他想取一个运行时类型并让它打出 Form form1 = new Form(); form1.Width = 800; form1.Height = 600;
  • 糟糕的措辞,但问题对我来说很清楚。

标签: c# .net visual-studio winforms


【解决方案1】:

这个MSDN magazine article 应该有你需要的一切。

【讨论】:

  • 完美的“不要重新发明轮子”的答案;)
【解决方案2】:

它真的不像之前 .NET 那样简单,因为您在 Visual Studio 中看到的表单的可视版本实际上是多个文件的结果。

但在最简单的形式中,您可以简单地反映 .NET 在开始创建新表单时所做的事情:

  1. 创建三个文件 Form.cs、Form.Designer.cs 和 Form.resx(这是一个 XML 文件)。
  2. 在其中放置与 VS 相同的默认内容
  3. 模仿添加控件、代码隐藏和资源时生成的代码

这将是一项乏味的任务,但可以完成。但是添加资源会很麻烦。

【讨论】:

    【解决方案3】:

    是的,如果您知道构建正确的 MSIL,您可以使用 Compiler Services(编译 c# 代码)或 Emit 类来实现此目的。

    【讨论】:

    • 这是直接的答案。但我觉得你问的问题是关于你解决另一个我不知道的问题的障碍。
    • 我猜你确实有理由重新发明轮子。
    • 另外,您可以考虑将 UI 控件图序列化为自定义格式并在运行时重新创建。
    • Emit 类不生成 IL 吗?我需要可以添加到解决方案并编译的实际 C# 代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 2011-05-25
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    相关资源
    最近更新 更多