我有一个使用包含多个 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);