여러 WPF 사용자 지정 구성 요소가 포함 된 캔버스를 사용하는 응용 프로그램이 있습니다. 이러한 구성 요소를 XAML 파일로 내 보내어 다른 응용 프로그램에서 가져올 수 있도록하고 싶습니다. 그러나 이렇게하려면 내 보낸 구성 요소에 접두어 한정자를 추가해야합니다. 나는 FrequencyButtonA 구성 요소를 수출했다 예를 들어, 나는 다음을 시도했습니다XElement를 사용하여 접두사가있는 XML 요소 만들기
<PanelControls:FrequencyButtonA Frequency="113.123" Width="250"/>
같은 출력 뭔가 필요 했어,하지만 난 인해의 사용에 예외를 받고 있어요 ':' 문자 :
return new XElement("PanelControls:" + "FrequencyButtonA");
아이디어가 있으십니까? 내가 여기에서 겪고있는 문제 (예 : this link)와 유사하지만 정확히 동일한 시나리오가 아닌 다른 질문을 발견했습니다.
미리 감사드립니다.
편집 - 자세한 배경 정보 : 이것은 생산해야 할 것 전체 출력의 예입니다
<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. 몇 가지 코드를 추가 : 다음과 같은 방법에 대한 코드는 그냥 참고로
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. 여기에 가능한 솔루션입니다 내 문제. 귀하의 의견을 주셔서 감사합니다 Reiner! 당신이 관련 네임 스페이스를 선언하는 경우
는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);
감사합니다,하지만 난 원합니다 내가 게시 한 것과 같이 더 컴팩트 한 출력. 귀하의 솔루션이 작동하는 것을 이해 합니다만, 결과 XAML을 최대한 간결하게하고 싶습니다. 내 게시물에있는 출력물을 얻는 방법을 제안 해 주시겠습니까? – Nacho1984
반환 된 XElement로 무엇을하고 있습니까? –
루트 요소에 추가하고 있습니다. 지금은 함수에 루트 객체 (캔버스)를 만든 다음 포함 된 모든 요소를 반복하고 나중에 각각에 첨부 된 XElement로 자신을 반환하기 위해 각 요소에 인스턴스 메서드를 호출합니다. 뿌리. – Nacho1984