【问题标题】:How to generate WPF controls automatically based on XML file?如何根据 XML 文件自动生成 WPF 控件?
【发布时间】:2018-09-25 04:48:58
【问题描述】:

我有一个 Xml 文件,它告诉我必须添加到表单中的控件,但此 Xml 动态更改,我需要更新表单。 目前,我可以读取 XML 文件,但我不知道是否可以根据它自动创建表单?

【问题讨论】:

  • 你能把你的xml文件的样本放上来

标签: c# wpf


【解决方案1】:

是的,有可能。

WPF 提供了多种在 Xaml 或代码中创建控件的方法。

如果您需要动态创建控件,则必须在代码中创建它们。您可以使用它们的构造函数直接创建控件,如下所示:

        // Create a button.
        Button myButton= new Button();
        // Set properties.
        myButton.Content = "Click Me!";

        // Add created button to a previously created container.
        myStackPanel.Children.Add(myButton);

或者您可以将控件创建为包含 xaml 的字符串,并使用 XamlReader 解析字符串并创建所需的控件:

        // Create a stringBuilder
        StringBuilder sb = new StringBuilder();

        // use xaml to declare a button as string containing xaml
        sb.Append(@"<Button xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' 
                            xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' ");
        sb.Append(@"Content='Click Me!' />");

        // Create a button using a XamlReader
        Button myButton = (Button)XamlReader.Parse(sb.ToString());

        // Add created button to previously created container.
        stackPanel.Children.Add(myButton);

现在,您要使用两种方法中的哪一种真正取决于您。

让-路易斯

【讨论】:

  • 谢谢!这正是我想要的!
【解决方案2】:

您可以通过 wpf 中的代码轻松添加控件,您可以follow this article。另一件值得注意的事情是,XAML 是 XML 的一种形式,因此您可以将 XAML 保存到 XML 文件中,这样您就不需要在代码中添加控件,但这取决于您的应用程序的复杂性。

【讨论】:

    【解决方案3】:

    我对 Xaml 还是很陌生,但是如果您不想将命名空间添加到每个元素字符串,那么可以添加到 Jean-Louis 的答案中,然后您可以使用 System.Windows.Markup 命名空间执行类似的操作:

                    ParserContext context = new ParserContext();
                context.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
                context.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml");
    
                string xaml = String.Format(@"<ListBoxItem Name='Item{0}' Content='{1}' />", itemID, listItems[itemID]);
                UIElement element = (UIElement)XamlReader.Parse(xaml, context);
    
                listBoxElement.Items.Add(element);
    

    【讨论】:

      【解决方案4】:

      通过 Children.Add 方法添加控件是我找到的最快的方法,例如

                  this.Grid.Add(new TextBox() { Text = "Babau" });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-19
        • 1970-01-01
        • 2013-09-09
        • 2015-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多