【问题标题】:How to dynamically generate content of form/grid in UserControl如何在 UserControl 中动态生成表单/网格的内容
【发布时间】:2018-03-26 20:13:52
【问题描述】:

我有 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 的 UnityBootstrapper)和来自 Prism 框架的区域编写的。我一直在考虑用 UserControls(Views) 和像 TextBoxModule 这样的棱镜模块包装 TextBox/DatePicker 等并动态注入它们,但我认为这不是一个好主意。

我正在寻找方向:/

【问题讨论】:

  • 这有规律吗?你能解释一下用法吗?我至少有两个方向你可以去,但哪个更合适取决于你想做什么。
  • 是的,它的用途是收集动态变化的数据(取决于 xml 布局)用于打印文档。内部应用程序用户加载布局(上面的示例),单击带有绑定命令的按钮以打开由 xml 布局中声明的控件填充的网格/堆栈面板的视图。每个控件都有额外声明的Meta Stack Overflowdata,例如边距或最终文档上的内容/文本的一些化妆品(不适用于生成控件的视图),但目前我并不担心。用户填写文本框等并单击下一步按钮后,将生成一些文档并准备打印。

标签: c# xml wpf


【解决方案1】:

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

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

如今构建动态 UI 的推荐方法是使用 XamlReader。 Load 方法允许您从文件和 Parse 方法从字符串创建 UI 对象。 如果您要重复执行相同的 ui,那么编写一个文件和 xamlreader.load 将是可行的方法。如果它们是一次性的,那么解析会更方便。 https://msdn.microsoft.com/en-us/library/system.windows.markup.xamlreader.parse%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396 这给了你一个对象 - 我应该认为你的网格是最好的。

由于 XAML 是 xml,您可以使用 xml to linq 机制来读取您的 xml,并再次将与控件对应的 xml 节点写入您的字符串。 您可以在此处查看示例: https://social.technet.microsoft.com/wiki/contents/articles/28797.wpf-dynamic-xaml.aspx 从那里粘贴代码有点毫无意义,无论如何都有很多。 没有人能完全按照你的要求做,但是如果你不知道怎么做,里面的东西就很难解决。 例如,您将需要与解析器上下文中的 xmlns 等效的内容。网格将与您现有的 XAML 完全分开实例化,因此您需要告诉它使用与窗口或用户控件相同的库。

我不确定显示的 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(显然)。

【讨论】:

  • 我一直在阅读有关 XamlReader 的信息,但布局,我的意思是声明文档布局的 XML 文档有它自己的格式。我无法像 TextBox 那样在节点内部写出。只有某个 Child 中的一个元素告诉我 Child 将是例如 TextBox 并且它是属性和值 - 文本。
  • 我建议您使用 linq to xml 迭代节点,并根据每个节点的内容构建 XAML 字符串。
  • 或者只是 system.xml
猜你喜欢
  • 1970-01-01
  • 2019-04-25
  • 2011-08-16
  • 2013-02-19
  • 1970-01-01
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多