如何使用x:键入WPF中的Xpath

时间:2018-01-23 15:41:01

标签: c# xml wpf xaml xpath

我一直在尝试编写正确的Xpath查询,但我似乎无法正确查看。它始终是错误或返回null ...

我有一个包含以下内容的XAML文件:

<ResourceDictionary>
        <Style x:Key="settingsBtnStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource overrideButtonMouseOver}">
            <Setter Property="Width" Value="64" />
            <Setter Property="Height" Value="64" />
            <Setter Property="Canvas.Left" Value="28" />
            <Setter Property="Canvas.Top" Value="690" />
            <Setter Property="Visibility" Value="Visible" />
            <Setter Property="Background">
                <Setter.Value>
                    <ImageBrush ImageSource="Img\settings.png" />
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>

我需要返回&#34; ImageBrush&#34;节点,但仅当x:Key的{​​{1}}为&#34; settingsBtnStyle&#34; 我使用XPath Visualizer来确保我有正确的Xpath,它是:

Style

现在在WPF中我写了

ResourceDictionary/Style[@x:Key="settingsBtnStyle"]/Setter[@Property="Background"]/Setter.Value/ImageBrush

Visual Studio一直在崩溃,告诉我

  

&#34;命名空间前缀&#39; x&#39;没有定义。

如何定义该命名空间/修复Xpath?

2 个答案:

答案 0 :(得分:3)

您需要将命名空间添加到XmlNamespaceManager。这应该有效:

XmlNamespaceManager manager = new XmlNamespaceManager(xDoc.NameTable);
manager.AddNamespace("def", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
manager.AddNamespace("x", "http://schemas.microsoft.com/winfx/2006/xaml");

XmlNode test = xDoc.SelectSingleNode("//def:Style[@x:Key=\"settingsBtnStyle\"]/def:Setter[@Property=\"Background\"]//def:ImageBrush", manager);

答案 1 :(得分:1)

编辑:
我终于开始工作,但我不知道它是否有效。我不得不向经理添加两个名称空间:

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

然后我必须在每个元素之前添加ns1:,如下所示:

var test = xDoc.SelectSingleNode("ns1:ResourceDictionary/ns1:Style[@x:Key=\"settingsBtnStyle\"]/ns1:Setter[@Property=\"Background\"]/ns1:Setter.Value/ns1:ImageBrush", manager);