いくつかの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);