使用Linq to XML实现动态WPF生成

3
我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我一直在尝试创建一些动态Xaml。

我有以下c#代码:

private void LoadUI()
{
    XNamespace xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation";

    dynamic UI = new XElement(xmlns + "Grid",
                              new XAttribute(XNamespace.Xmlns + "x", "http://schemas.microsoft.com/winfx/2006/xaml"),
                              new XAttribute("Name", "Grid1"),
                              new XElement(xmlns + "Grid.ColumnDefinitions",
                                           new XElement(xmlns + "ColumnDefinition", new XAttribute("Width", "100*")),
                                           new XElement(xmlns + "ColumnDefinition", new XAttribute("Width", "200*"))),
                              new XElement(xmlns + "StackPanel", new XAttribute("Name", "StackLabels"),
                                           new XAttribute("Margin", "3"),
                                           from column in this.TableSchema
                                           where column.IsPrimaryKey == 0 && column.DataType != "timestamp"
                                           select
                                               new XElement(xmlns + "Label", new XAttribute("Height", "28"),
                                                            new XAttribute("Name", column.ColumnName + "Label"),
                                                            new XAttribute("HorizontalContentAlignment", "Right"),
                                                            column.ColumnName)),
                              new XElement(xmlns + "StackPanel",
                                           new XAttribute("Grid.Column", "1"),
                                           new XAttribute("Name", "StackFields"),
                                           new XAttribute("Margin", "3")
                                  ,

                from column in this.TableSchema
                where column.IsPrimaryKey == 0 && column.DataType != "timestamp"
                select
                GetUIElement(column)));

    this.DynamicContent.Content = XamlReader.Load(UI.CreateReader());

}

我得到的错误是尝试创建Grid.Column时出错。确切的错误是{"Der unbekannte Member \"Grid.Column\" kann nicht festgelegt werden."},所以它不知道Grid.Column...有人有任何想法吗?注释掉的新XAttribute("Grid.Column", "1")这一行可以正常工作,只是不能自然地显示我想要的内容!生成的网格如下所示:
 <Grid xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Name="Grid1"   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="100*" />
    <ColumnDefinition Width="200*" />
  </Grid.ColumnDefinitions>
  <StackPanel Name="StackLabels" Margin="3">
    <Label Height="28" Name="NummerLabel" HorizontalContentAlignment="Right">Nummer</Label>    
  </StackPanel>
  <StackPanel Grid.Column="1" Name="StackFields" Margin="3">
    <TextBox Height="28" Name="txtNummer" Text="{Binding Path=Nummer}" />
    </StackPanel>
    </Grid>

错误是在XamlReader.Load之前还是之后发生的?最好发布完整的错误信息。 - H H
抱歉,是的,错误发生在XamlReader.Load中。UI中的Xaml看起来对我来说很好... - stackeroverflow
尝试在VS中加载生成的XAML并让它自动格式化。很容易错过一个关闭标签或其他内容。可以在这里发布一个示例吗? - H H
当您使用XamlReader.Parse(xaml)时会发生什么? - Emond
尝试将dynamic UI = ...替换为var UI = ...我已经模拟了您的示例,并通过此更改使其正常工作。您确定真的需要“动态”类型吗? - SvenG
1个回答

2

编辑:

这是可以重现的。似乎在XamlReader.Load与提供的XmlReader交互时存在一些问题。它会抛出XamlParseException异常,提示“无法设置未知成员'Grid.Column'。”

奇怪的是,将其转换为字符串并从中加载XAML可以正常工作:

var xml = UI.ToString();
var reader = XmlReader.Create(new StringReader(xml));
var content = XamlReader.Load(reader); // works now.

我看到你在创建XML标记,然后再将其转换为UI对象。为什么不直接从查询中创建UI对象呢?


只要我忽略grid.column,xaml就是有效的。也许我只是喜欢这种方法... - stackeroverflow
我可以重现你的问题。如果你想搜索,我已经在我的答案中用英语列出了异常情况。 - majocha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接