У меня есть приложение, которое использует холст, содержащий несколько пользовательских компонентов 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"/>
I forgot to mention in my original post that the root node (Border) gets created inside a method. The method then loops through all the elements placed in the canvas and calls a method on said elements that returns an XElement which is later added to the root node. Thus, I need to make the XElements be able to create themselves. The code for the method is as follows:
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. Добавлен код, чтобы Рейндер мог видеть мой текущий подход:
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);