1

我有一个使用包含多个 WPF 自定义组件的画布的应用程序。我想将这些组件导出到一个 XAML 文件中,以便另一个应用程序可以获取它,但是为了做到这一点,我需要为导出的组件添加前缀限定符。例如,如果我要导出一个 FrequencyButtonA 组件,我需要输出类似

<PanelControls:FrequencyButtonA Frequency="113.123" Width="250"/>

我尝试了以下方法,但由于使用了“:”字符,我遇到了异常:

return new XElement("PanelControls:" + "FrequencyButtonA");

有任何想法吗?我在 SO 中发现了一些其他问题,这些问题似乎与我遇到的问题相似(例如,这个链接),但不是完全相同的场景。

提前致谢!

编辑 - 更多背景信息:这是我需要生成的完整输出的示例:

<Border x:Name="CommsPanelBorder"
    Style="{DynamicResource BorderTemplate}"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:PanelControls="clr-namespace:CommsPanelControlsLib.View;assembly=CommsPanelControlsLib"
    VerticalAlignment="Top">
        <PanelControls:FrequencyButtonB Frequency="113.123" Width="250"/>
        <PanelControls:FrequencyButtonA Frequency="102.3" Width="150"/>

我忘了在我原来的帖子中提到根节点(边框)是在方法中创建的。然后,该方法遍历放置在画布中的所有元素,并在所述元素上调用一个方法,该方法返回一个 XElement,稍后将其添加到根节点。因此,我需要让 XElements 能够自己创建。该方法的代码如下:

XNamespace aw = "http://schemas.microsoft.com/winfx/2006/xaml/presentation";
        XNamespace ns = "PanelControls";
        var root = new XElement(aw + "Border",
            new XAttribute("Style", "{DynamicResource BorderTemplate}"),
            new XAttribute("Name", "CommsPanelBorder"),
            new XAttribute(XNamespace.Xmlns + "x", "http://schemas.microsoft.com/winfx/2006/xaml"),
            new XAttribute(XNamespace.Xmlns + "PanelControls", "clr-namespace:CommsPanelControlsLib.View;assembly=CommsPanelControlsLib"),
            new XAttribute("VerticalAlignment", "Top")
        );

        IEnumerable<CommsPanelControl> commsPanelControls = editCanvas.Children.OfType<CommsPanelControl>();

        foreach (var commsPanelControl in commsPanelControls)
        {
            XElement xElement = commsPanelControl.AddXElement(root, ns);
            root.Add(xElement);
        }

编辑 2. 添加了一些代码,以便 Reinder 可以看到我当前的方法:

XNamespace aw = "http://schemas.microsoft.com/winfx/2006/xaml/presentation";
        XNamespace ns = "PanelControls";
        var root = new XElement(aw + "Border",
            new XAttribute("Style", "{DynamicResource BorderTemplate}"),
            new XAttribute("Name", "CommsPanelBorder"),
            new XAttribute(XNamespace.Xmlns + "x", "http://schemas.microsoft.com/winfx/2006/xaml"),
            new XAttribute(XNamespace.Xmlns + "PanelControls", "clr-namespace:CommsPanelControlsLib.View;assembly=CommsPanelControlsLib"),
            new XAttribute("VerticalAlignment", "Top")
        );

        XElement xElement = new XElement(ns + "FrequencyButtonA",
            new XAttribute("Frequency", "113.123"),
            new XAttribute("Width", "250"));
        root.Add(xElement);

编辑 3. 作为参考,这是我的问题的可能解决方案。感谢莱纳您的意见!

XNamespace aw = "http://schemas.microsoft.com/winfx/2006/xaml/presentation";
        XNamespace ns = "clr-namespace:CommsPanelControlsLib.View;assembly=CommsPanelControlsLib";
        var root = new XElement(aw + "Border",
            new XAttribute("Style", "{DynamicResource BorderTemplate}"),
            new XAttribute("Name", "CommsPanelBorder"),
            new XAttribute(XNamespace.Xmlns + "x", "http://schemas.microsoft.com/winfx/2006/xaml"),
            new XAttribute(XNamespace.Xmlns + "PanelControls", "clr-namespace:CommsPanelControlsLib.View;assembly=CommsPanelControlsLib"),
            new XAttribute("VerticalAlignment", "Top")
        );

        XElement xElement = new XElement(ns + "FrequencyButtonA",
            new XAttribute("Frequency", "113.123"),
            new XAttribute("Width", "250"));
        root.Add(xElement);
4

2 回答 2

4

只有当您声明与其相关的命名空间时,前缀 likePanelControls才有意义。

您需要在节点本身或例如在根中指定它。

// create the root element, with the 'PanelControls' namespace
XNamespace nSpace = "PanelControls";
XElement element = new XElement("root",
          new XAttribute(XNamespace.Xmlns + "PanelControls", nSpace));

element.Add(addXElement("FrequencyButtonA", nSpace ));

...

private static XElement addXElement(string n, XNamespace ns)
{
    return new XElement(ns + n,
        new XAttribute("Frequency", 113.123),
        new XAttribute("Width", 250));
}

方法 'addXElement()' 将在命名空间 ns 中创建新的 XElement,因此您最终会得到:

<?xml version="1.0"?>
<root xmlns:PanelControls="PanelControls">
    <PanelControls:FrequencyButtonA Width="250" Frequency="113.123"/>
</root>
于 2012-10-22T14:19:25.103 回答
1
using System;
using System.Xml.Linq;


class Program
{
    static void Main(string[] args)
    {

        XNamespace @namespace = "PanelControls";
        XElement element = new XElement("root",
            new XAttribute(XNamespace.Xmlns + "PanelControls", @namespace),
            new XElement(@namespace + "FrequencyButtonA",
                new XAttribute("Frequency", 113.123),
                new XAttribute("Width", 250)));
        Console.WriteLine(element);
    }
}
于 2012-10-22T14:21:51.180 回答