C# 如何在UserControl中动态生成表单/网格的内容

C# 如何在UserControl中动态生成表单/网格的内容,c#,xml,wpf,C#,Xml,Wpf,我有XML文档 <fields> <field type="text">Firstname</field> <field type="text">Lastname</field> <field type="date">Birthday</field> </fields> 名字 姓氏 生日 (这是一个简单的示例,但在字段内部有关于某些页边距、文本或文本框大小等的声明) 我必须根据XML

我有XML文档

<fields>
  <field type="text">Firstname</field>
  <field type="text">Lastname</field>
  <field type="date">Birthday</field>
</fields>

名字
姓氏
生日
(这是一个简单的示例,但在字段内部有关于某些页边距、文本或文本框大小等的声明)

我必须根据XML文档内容为文本生成TextBox控件,为日期生成一些DatePicker(扩展wpf)控件。 我无法在代码背后生成它,在检查了这么多与我的问题类似的不同示例后,我感到困惑

我正在写的项目是使用MVVM模式、IoC(来自Prism的UnityBootTrapper)和Prism框架中的区域编写的。我一直在考虑用用户控件(视图)和棱柱模块(如TextBoxModule)包装TextBox/DatePicker等,并动态注入它们,但我认为这不是一个好主意


我在寻找一些方向:/

好的,所以最终的结果是一个网格,上面有控件,而不是标签字段的列表

我认为PRISM的区域和其他东西会阻碍这一点,我不会使用它们中的任何一个

现在构建动态UI的推荐方法是使用XamlReader。Load方法允许您从文件创建UI对象,从字符串创建Parse方法。 如果要重复执行相同的ui,那么编写一个文件和xamlreader.load将是一个不错的选择。如果它们是一次性的,那么解析就更方便了。 这给了你一个对象-我认为你的网格会是最好的

因为XAML是xml,所以您可以使用xml到linq机制来读取xml,并再次将与控件对应的xml节点写入字符串。 您可以在此处查看以下示例: 从那里粘贴代码有点毫无意义,而且在任何情况下都有相当一部分。 没有人能精确地做你想做的事情,但如果你不知道怎么做,其中有些东西是很难解决的。 例如,在这里,您将需要与parsercontext相当的xmlns。网格的实例化将完全独立于现有的XAML,因此您需要告诉它使用与窗口或用户控件相同的库

我不确定所显示的xml有多具有代表性,因此,与其尝试编写一些东西来处理这些xml,我将向您展示如何迭代节点,也许可以让您开始

        string myXMLfile =  @"d:\biz\xml.xml";
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(myXMLfile);
        XmlElement xmlRoot = xmlDoc.DocumentElement;
        XmlNodeList Fields xmlRoot.ChildNodes;
        foreach (XmlNode field in Fields)
        {
您可以使用.Name和.InnerText。
属性也有xmlattributes(显然)。

这有模式吗?你能解释一下用法吗?我至少有两个方向可以选择,但哪一个更合适取决于您想做什么。是的,用法是收集动态变化的数据(取决于xml布局)以打印文档。在应用程序内部,用户加载布局(上面的示例),单击带有bined命令的按钮打开视图,其中grid/stackpanel由xml布局中声明的控件填充。每个控件都有额外的声明数据,比如最终文档中内容/文本的边距或一些化妆品(不是用于生成控件的视图),但现在我不担心它。用户填写文本框等并单击“下一步”按钮后,将生成一些文档并准备打印。我一直在阅读有关XamlReader的内容,但布局,我是指声明文档布局的XML文档有自己的格式。我不能像文本框一样在节点内部写出。只有某个子节点中的一个元素告诉我该子节点将是例如TextBox,它是attribute,它的value-text。我建议您使用linq-to-xml迭代节点,并根据每个节点拥有的内容构建XAML字符串。或者仅使用system.xml