2012-10-22 2 views
1

여러 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); 

답변

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> 
+0

감사합니다,하지만 난 원합니다 내가 게시 한 것과 같이 더 컴팩트 한 출력. 귀하의 솔루션이 작동하는 것을 이해 합니다만, 결과 XAML을 최대한 간결하게하고 싶습니다. 내 게시물에있는 출력물을 얻는 방법을 제안 해 주시겠습니까? – Nacho1984

+0

반환 된 XElement로 무엇을하고 있습니까? –

+0

루트 요소에 추가하고 있습니다. 지금은 함수에 루트 객체 (캔버스)를 만든 다음 포함 된 모든 요소를 ​​반복하고 나중에 각각에 첨부 된 XElement로 자신을 반환하기 위해 각 요소에 인스턴스 메서드를 호출합니다. 뿌리. – Nacho1984

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); 
    } 
} 
+0

답장을 보내 주셔서 감사합니다. 귀하의 솔루션은 FrequencyButtonA에 필요한 코드를 출력하지만, 원래 게시물에서 루트 요소가 다른 위치에 생성 된 다음 주파수 요소와 같은 개별 요소가 stadalone XElement 인스턴스로 생성된다는 것을 잊어 버렸습니다. 루트에 추가됩니다. 루트 요소를 만든 후에 원래 게시물에 제공 한 예제와 같은 것을 출력 할 수있는 방법이 있습니까? 다른 접근 방법을 시도했지만 매우 자세한 출력을 얻고 있으며 출력을 간결하게 유지하려고합니다. – Nacho1984

관련 문제