이번 시간에는 사용자가 작업중인 현재 WPF Application 에서 사용되는 객체를 XAML로 Export 및 Import를 수행하는 방법에 대한 내용을 소개합니다. WPF에서는 XAML에 제공된 런타임 개체의 Serialization에 사용할 수 있는 단일 정적 Save 및 Lode메서드를 제공합니다. 각각 System.Windows.Markup Namespace의 XamlWriter와 XamlReader라는 Class의 Static 메서드로 제공되고 있으며 Exporter 구현을 위한 XamlWriter에 대해서 알아보겠습니다.
XamlWriter는 제공된 개체를 XAML문자열을 반환하는 기능을 수행하는 Save란 메서드를 제공하며 Save메서드에 대한 Overload 목록은 아래와 같습니다.
- Save(Object) - 제공된 개체와 해당 속성을 serialize하는 XAML(Extensible Application Markup Language) 문자열을 반환합니다.
- Save(Object, Stream) - 제공된 개체와 해당 속성을 serialize하기 위해 XAML(Extensible Application Markup Language) 정보를 제공된 스트림에 저장합니다.
- Save(Object, TextWriter) - XAML(Extensible Application Markup Language) 정보를 제공된 텍스트 작성기 개체의 소스로 저장합니다. 그런 다음 텍스트 작성기의 출력을 사용하여 제공된 개체와 해당 속성을 serialize할 수 있습니다.
- Save(Object, XamlDesignerSerializationManager) - XAML(Extensible Application Markup Language) 정보를 사용자 지정 serializer에 저장합니다. 그런 다음 serializer의 출력을 사용하여 제공된 개체와 해당 개체의 속성을 serialize할 수 있습니다.
-
Save(Object, XmlWriter) - XAML(Extensible Application Markup Language) 정보를 제공된 XML 작성기 개체의 소스로 저장합니다. 그런 다음 XML 작성기의 출력을 사용하여 제공된 개체와 해당 속성을 serialize할 수 있습니다.
※ 원본 주소 : http://msdn.microsoft.com/ko-kr/library/system.windows.markup.xamlwriter.save.aspx
일반 적으로 Save(Object) 형식의 메서드를 사용하며 Object Parameter에 WPF객체를 전달하면 XAML로 Serialization된 문자열이 반환 됩니다.
아래 소스코드는 WPF Button객체를 XAML 문자열로 변환하는 간단한 Exporter를 구현한 C# 코드입니다.
|
// Create the Button. Button TmpButton = new Button(); TmpButton.Height = 50; TmpButton.Width = 100; TmpButton.Background = Brushes.AliceBlue; TmpButton.Content = "Click Me"; // Save the Button to a string. string ButtonXAML = System.Windows.Markup.XamlWriter.Save(TmpButton); |
만약 위와 같은 코드가 있다면 ButtonXAML이라는 변수에는 아래와 같은 결과가 저장되게 됩니다.
<Button Background="#FFF0F8FF" Width="100" Height="50" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">Click Me</Button>
그리고 만약 아래와 같이 해당 객체가 자식 객체를 소유 하고 있을 경우도 변환이 가능합니다.
|
// Create the Button. Button TmpButton = new Button(); TmpButton.Height = 50; TmpButton.Width = 100; TmpButton.Background = Brushes.AliceBlue; TmpButton.Content = "Click Me"; // Create the Canvs Canvas TmpCanvas = new Canvas(); TmpCanvas.Children.Add(TmpButton); // Save the Button to a string. string ButtonXAML = System.Windows.Markup.XamlWriter.Save(TmpButton); string CanvasXAML = System.Windows.Markup.XamlWriter.Save(TmpCanvas); |
이와 같은 코드에서는 CanvasXAML에는 아래와 같은 Xaml코드가 생성됩니다.
<Canvas xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Button Background="#FFF0F8FF" Width="100" Height="50">Click Me</Button>
</Canvas>
반대로 XAML 문자열을 WPF객체로 변환하는 코드는 아래와 같습니다.
|
// using System.Windows.Markup; // using System.Xml; // using System.IO; // Create the Button. Button TmpButton = new Button(); TmpButton.Height = 50; TmpButton.Width = 100; TmpButton.Background = Brushes.AliceBlue; TmpButton.Content = "Click Me"; // Save the Button to a string. string ButtonXAML = System.Windows.Markup.XamlWriter.Save(TmpButton); // Import XAML String StringReader stringReader = new StringReader(ButtonXAML); XmlReader xmlReader = XmlReader.Create(stringReader); Button readerLoadButton = (Button)XamlReader.Load(xmlReader); |

