在运行时加载网格定义

时间:2017-11-22 13:27:36

标签: c# wpf xaml dynamic

XAML代码段是根据文件的数据生成的。

<Grid.RowDefinitions>
   <RowDefinition Height='0*'/>
   <RowDefinition Height='1*'/>
   <RowDefinition Height='0*'/>
</Grid.RowDefinitions>

我的目标是将此代码段加载到:

<Window ...>
   <Grid x:Name="TheGrid">
       <!-- HERE -->
   </Grid>
</Window>

因此,在编译之后,我可以在每次启动之前为我的软件定义网格布局。

我试过这样做:

using (Stream stream = GenerateStreamFromString(text))
{
   var element = XamlReader.Load(stream) as UIElement;
   grid.Children.Add(element);
}

问题是XamlReader.Load(...)抛出异常:

  

属性元素'Grid.RowDefinitions'不包含在对象元素中。

     

行号“1”和行位置“2”。

问题(在我看来)是在加载环境中没有Grid元素,因此存在无效引用。

如何解决这个问题或如何轻松实现同一目标?

2 个答案:

答案 0 :(得分:1)

在这种情况下无需使用XAMLReader - 只需使用代码直接添加它们,并按名称引用Grid

TheGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(0d, GridUnitType.Star)});
TheGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1d, GridUnitType.Star)});
TheGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(0d, GridUnitType.Star)});

答案 1 :(得分:1)

您的XAML代码段无效,因为它没有根元素。此外,RowDefinition不是您添加到UIElement的{​​{1}}集合中的Children

给出以下输入数据:

Grid

...您可以使用string data = "<Grid.RowDefinitions><RowDefinition Height='0*' /><RowDefinition Height='1*' /><RowDefinition Height='0*' /></Grid.RowDefinitions>"; XDocument来创建GridLengthConverter

RowDefinitions