我有一组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#中的网格中划分内容,会更简单。