XPath从Silverlight 5 XAML中获取RowDefinitions和ColumnDefinitions



我有一组Silverlight 5 XAML文档,它们以以下结构开头

<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"  d:DesignWidth="1000" d:DesignHeight="800" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">
<Grid x:Name="LayoutRoot">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="280"></ColumnDefinition>
<ColumnDefinition Width="50*"></ColumnDefinition>
<ColumnDefinition Width="50*"></ColumnDefinition>
</Grid.ColumnDefinitions>
...other content below

我需要一个XPath表达式,它允许我选择RowDefinition和ColumnDefinition元素。

我试过:

XmlDocument xdoc = new XmlDocument();
XmlNamespaceManager mgr = new XmlNamespaceManager(xdoc.NameTable);          
xdoc.LoadXml(xaml);
XmlNodeList rowDefinitions = xdoc.DocumentElement.ChildNodes[0].SelectNodes("//RowDefinition", mgr);

但没有取得任何成功。我需要做什么?

想明白了,在这里发布答案,以防有人遇到同样的问题。

关键是,您必须指定正在分析的元素的命名空间,即使XAML没有显式声明该元素的命名空间。在我的案例中,添加:

mgr.AddNamespace("x", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");

然后将RowDefinition元素引用为:

xdoc.SelectNodes("//x:RowDefinition", mgr)

能够成功。

为什么不像这样定义XAML内部的结构

<Border Grid.Column="1" Grid.Row="1" BorderThickness="3" BorderBrush="Black" CornerRadius="10" Height="AUTO" Background="DarkGray">

在这种情况下,它是for border,但可以用于任何标记,因为如果要定义如何在XAML侧而不是C#中的网格中划分内容,会更简单。

最新更新