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"/>

元の投稿で、ルートノード(Border)がメソッド内に作成されることを忘れました。次に、メソッドはキャンバスに配置されたすべての要素をループし、後でルートノードに追加される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

のようなプレフィックスはPanelControls、関連する名前空間を宣言する場合にのみ意味があります。

これは、ノード自体またはたとえばルートで指定する必要があります。

// 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 に答える