繁体   English   中英

在运行时加载网格定义

[英]Loading Grid Definitions at runtime

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元素,因此存在无效的引用。

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

在这种情况下,无需使用XAMLReader只需使用代码直接添加它们, 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)});

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

给定以下输入数据:

string data = "<Grid.RowDefinitions><RowDefinition Height='0*' /><RowDefinition Height='1*' /><RowDefinition Height='0*' /></Grid.RowDefinitions>";

...您可以使用XDocumentGridLengthConverter来创建RowDefinitions

GridLengthConverter converter = new GridLengthConverter();
foreach (var row in doc.Root.Elements("RowDefinition"))
{
    string height = row.Attribute("Height").Value;
    TheGrid.RowDefinitions.Add(new RowDefinition() { Height = (GridLength)converter.ConvertFrom(height) });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM