[英]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
不是您添加到Grid
的Children
集合中的UIElement
。
给定以下输入数据:
string data = "<Grid.RowDefinitions><RowDefinition Height='0*' /><RowDefinition Height='1*' /><RowDefinition Height='0*' /></Grid.RowDefinitions>";
...您可以使用XDocument
和GridLengthConverter
来创建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.