2021년 11월 20일 토요일

(WPF교육, WPF학원)XAML 네임스페이스,C# 파일의 문자열을 XAML로 파싱하여 실행, Xaml Resource 및 Window 로드 예제

 

(WPF교육, WPF학원)XAML 네임스페이스,C# 파일의 문자열을 XAML로 파싱하여 실행, Xaml Resource 및 Window 로드 예제

http://ojc.asia/bbs/board.php?bo_table=WPF&wr_id=158 


XAML 네임스페이스,C# 파일의 문자열을 XAML로 파싱하여 실행, Xaml Resource 및 Window 로드 예제

XAML 네임스페이스,C# 파일의 문자열을 XAML로 파싱하여 실행, Xaml Resource 및 Window 로드 예제2.3.3 XAML 네임스페이스앞 예문에서 Button을 사용했는데 어떤 버튼일까? 와이셔츠의 단추? 전자계산기의 버

ojc.asia

https://www.youtube.com/watch?v=vlVKwC1ALmM&list=PLxU-iZCqT52Cmj47aKB1T-SxI33YL7rYS&index=4 

https://www.youtube.com/watch?v=innYXvo9WpA&list=PLxU-iZCqT52Cmj47aKB1T-SxI33YL7rYS&index=2&t=33s 


2.3.3 XAML 네임스페이스 


  • 앞 예문에서 Button을 사용했는데 어떤 버튼일까? 와이셔츠의 단추? 전자계산기의 버튼? 같은 엘리먼트 이름을 서로 다른 목적으로 사용한다면 명확히 구분해야 한다. 이때 네임스페이스가 필요한 것이다.


  • XML 문서안의 xmlns 속성은 기본적인 XML 네임스페이스로 선언되며 네임스페이스 선언이 있는 곳의 엘리먼트와 자식 엘리먼트 모두에 적용된다. 또한 XML 네임스페이스 이름은 유일하고 영속적이므로 URL을 사용하는 것이 일반적이다. WPF에서 사용하는 XAML의 URL은 다음과 같다.


<Window x:Class="WpfApplication1.MainWindow"

xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation

…… 


실제 URL이 들어가도 의미없다. 이것은 MS가 Button, StackPanel과 같은 엘리먼트를 구별해 내기 위해 고안한 네임스페이스 명이다.


만약 버튼 하나로만 XAML 파일을 만들기 위해서는 다음과 같이 네임스페이스만 기술해도 된다.


[XamlButton.xaml]

<Button xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation” 

        Foreground = “LightSeaGreen”

        FontSize = “24pt”>

Hello, WPF!

</Button>


위에서 만든 XamlButton.xaml을 느슨한 XAML, Stand Alone XAML(어느 코드에도 속하지 않는 독립적인 XAML 파일)이라고 부르는데 .xaml 확장자는 PresentationHost.exe와 연결되어 있고 이를 실행하면 인터넷 익스플러러가 Page(FrameworkElement를 상속받은 Window와 비슷한) 타입의 객체를 생성하여 실행한다. PresentationHost.exe 파일은 로드된 XAML 파일을 실제 Button 객체로 변환한 후 이 객체를 Page의 Content 프로퍼티에 설정한다.


2.3.4 Load Embedded Xaml(C# 파일의 문자열을 XAML로 파싱하여 실행하기)


  • 다음과 같이 코딩된 C# 프로그램이 있을 때


srting strXaml = “<Button “ +

“ xmlns=’http://schemas.microsoft.com/winfx/2006/xaml/presentation’ “ +

                “ Foreground = ‘LightSeaGreen’ “ +

                “ FontSize = ‘24pt’> “ +

            “ Hello, WPF! “ +

“ </Button> “;


문자열 안의 코드를 통해 버튼 객체를 생성하고 속성을 초기화 하는 작업을 한다고 할 때 리플렉션을 사용해야 하고 Foreground, FontSize 같은 속성을 설정하기 위해서는 사용된 데이터에 대한 가정이 필요하므로 이러한 일을 할 “파서”가 필요하다.


System.Window.Markup 네임스페이스의 XamlReader 클래스가 그러한 일을 하는데 Load라는 정적 메소드를 통해 XAML을 파싱해 초기화된 객체로 전환한다. 반대로 Save 메소드는 객체로부터 XAML을 생성하는 일을 한다. Load 메소드는 인자로 Stream 또는 XmlReader 객체를 필요로 하므로 다음처럼 직접 사용은 불가능 하다.


Button b = (Button)XamlReader.Load(strXaml);  //잘못된 사용법


방법1.

using System.IO;


MemoryStream memory = new MemoryStream(strXaml.Length);

StreamWriter writer = new StreamWriter(memory);

writer.Write(strXaml);

writer.Flush();

memory.Seek(0, SeekOrigin.Begin);

Object obj = XamlReader.Load(memory);


방법2.

using System.Xml;

using System.IO;


StringReader strReader = new StringReader(strXaml);

XmlTextReader xmlReader = new XmlTextReader(strReader);

object obj = XamlReader.Load(xmlReader);


App.xaml, MainWindow.xaml을 삭제하고 작성하자.


  • LoadXaml.cs


using System;

using System.IO;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Markup;

using System.Xml;


namespace WpfApplication2

{

    class LoadXaml : Window

    {

        [STAThread]

        public static void Main()

        {

            Application app = new Application();

            app.Run(new LoadXaml());

        }

        public LoadXaml()

        {

            Title = "Load Embedded Xaml";


            string strXaml =

                "<Button xmlns='http://schemas.microsoft.com/" +

                                      "winfx/2006/xaml/presentation'" +

                "        Foreground='LightSeaGreen' FontSize='24pt'>" +

                "    Hello, WPF!" +

                "</Button>";


            StringReader strReader = new StringReader(strXaml);

            XmlTextReader xmlReader = new XmlTextReader(strReader);

            Button b = (Button)XamlReader.Load(xmlReader);

            b.Click += Button_Click;


            Content = b;

        }


        void Button_Click(object sender, EventArgs args)

        {

            MessageBox.Show("Emnbedded Xaml Test");

        }

    }

}



  • Xaml Resource 및 Window 로드 예제


  1. 비주얼 스튜디오 -> WPF 응용프로그램 , 프로젝트명 : LoadXamlWindow
  2. App.xaml, MainWindow.xaml 삭제
  3. 프로젝트 -> 우측마우스 -> 추가 -> 새항목추가




[XamlWindow.xml] – 코딩해보세요   

파일 생성 후 속성을 확인하면 빌드작업 속성에 “Resource”로 되어 있다.


<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        Title="Load Xaml Window And Button"

        SizeToContent="WidthAndHeight"

        ResizeMode="CanMinimize">

    <StackPanel>

    <Button HorizontalAlignment="Center"

                Margin="40" Name="XamlButton">

      Hello, WPF!

    </Button>


    <Ellipse Width="100"

             Height="50"

             Margin="24"

             Stroke="Red"   //경계선을 그릴 브러쉬

             StrokeThickness="10" />


    <ListBox Width="100"

                 Height="100"

                 Margin="24">

        <ListBoxItem></ListBoxItem>

        <ListBoxItem>사과</ListBoxItem>

     <ListBoxItem></ListBoxItem>

        <ListBoxItem>바나나</ListBoxItem>

        <ListBoxItem>수박</ListBoxItem>

        <ListBoxItem>참외</ListBoxItem>

      </ListBox>            

      </StackPanel>

</Window>        



4. 프로젝트 -> 우측마우스 -> 추가 -> 새항목추가


[LoadXamlWindow.cs] – 코딩해보세요

    

using System;

using System.IO;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Markup;


namespace LoadXamlWindow

{

    class LoadXamlWindow 

    {

        [STAThread]

        public static void Main()

        {

            Application app = new Application();

            // Pack Uri 체계를 통한 리소스 파일을 식별하여 로딩

// 로컬 어셈블리의 프로젝트 폴더 루트에 있는 리소스 파일에 대한 Pack URI

Uri uri = new Uri("pack://application:,,,/XamlWindow.xml");

            Stream stream = Application.GetResourceStream(uri).Stream;

            Window win = XamlReader.Load(stream) as Window;

                        

            win.AddHandler(Button.ClickEvent, new RoutedEventHandler(Button_Click1));

            Button b = (Button)win.FindName("XamlButton");  // XAML파일에 정의

            b.Click += Button_Click2;

            app.Run(win);      

        }


        static void Button_Click1(object sender, RoutedEventArgs args)

        {

            MessageBox.Show((args.Source as Button).Content.ToString()+"1");

        }


        static void Button_Click2(object sender, EventArgs args)

        {

            MessageBox.Show(((Button)sender).Content.ToString()+"2");

        }

    }

}



  • 실행화면


  • XamlWindow.xml 파일은 Stand Alone xaml 파일과 유사한데 가장 큰 차이는 Button 객체에 Name 속성을 포함시킨 것으로 이 속성은 FrameworkElement에 의해 정의된 것이다.
  • LoadXamlWindow.cs 파일의 생성자에서 XML 리소스를 위한 Uri 객체를 생성하고 StreamResourceInfo 객체를 반환하기 위한 Application.GetResourceStream 정적프로퍼티를 사용한다. StreamResourceInfo는 리소스를 위한 스트림을 반환하는 Stream 프로퍼티가 있으며 이 스트림 객체가 XamlReader.Load 메소드의 인자로 들어가고 반환되는 객체를 Window의 Content 프로퍼티에 할당한다.
  • 일단 Xaml로부터 변환되어 Window의 비주얼 트리의 일부가 되면 FindName 메소드로 이름을 통해 엘리먼트를 찾는 것이 가능하고 이벤트 등을 달 수 있다.
  • 버튼에 이벤트를 달기 위한 다른 방법으로 XamlReader.Load의 반환값을 Window 객체로 받은 후 버튼 클릭 이벤트 핸들러를 비주얼 트리속에서 찾아 연결하지 않고 Window의 AddHandler를 이용하여 버튼의 클릭 이벤트 핸들러 메소드를 정의했다. 
  • Application의 Run을 호출시 인자로 Window 객체를 전달해서 윈도우 실행

#XAML네임스페이스, #XAML강좌, #XamlResource, #WPF교육, #WPF강의, #WPF학원 

XAML네임스페이스, XAML강좌, XamlResource, WPF교육, WPF강의, WPF학원 

(WPF교육, WPF학원)WPF Content Property란?

 

(WPF교육, WPF학원)WPF Content Property란?

http://ojc.asia/bbs/board.php?bo_table=WPF&wr_id=157 


(WPF교육)WPF Content Property란?

(WPF교육)WPF Content Property란?ContentControl을 상속받은 컨트롤들은 ContentPropertyAttribute로 불리는 특별한 어트리큐트로 지정된 특별한 속성을 가지는데 이를 ContentPropery라고 한다. ContentProperty 이름은 Co

ojc.asia

https://www.youtube.com/watch?v=innYXvo9WpA&list=PLxU-iZCqT52Cmj47aKB1T-SxI33YL7rYS&index=2&t=29s 

https://www.youtube.com/watch?v=vlVKwC1ALmM&list=PLxU-iZCqT52Cmj47aKB1T-SxI33YL7rYS&index=4&t=37s 

  • ContentControl을 상속받은 컨트롤들은 ContentPropertyAttribute로 불리는 특별한 어트리큐트로 지정된 특별한 속성을 가지는데 이를 ContentPropery라고 한다. ContentProperty 이름은 Content가 대부분 이지만 아닌 경우도 있다. Button, Label은 Content, StackPanel은 Children이다.
  • XAML에서 Button 태그 사이에 어떤속성에 대입되는 값인지 기술하지 않고 적으면 Button의 ContenetPropertyAttribute에서 기술한 Content 속성에 대입된다. 

<Button>

//Button의 ContentPropertyAttribute에서 기술한 Content라는 속성에 대입

Hello! WPF~

</Button>


  • XAML 프로세서가 XAML 의 자식 엘리먼트를 프로세싱할때 사용하는 정보
  • ContentPropertyAttribute로 지정된 속성은 자식 요소를 담고있는 컨테이너 또는 부모 요소 일 수도 있다. 아래 코드는 Button의 내용으로 5 개의 자식 요소가 있는 StackPanel 컨테이너를 설정한다.

<Button Margin="10,201,100,40">  

<StackPanel Orientation="Horizontal">  

<Ellipse Height="60" Width="60" Fill="Red"/>  

<TextBlock TextAlignment="Center"><Run Text=" Red Circle"/>  

<TextBlock TextAlignment="Center"><Run Text=" "/></TextBlock>  

<Rectangle Height="60" Width="120" Fill="Green"></Rectangle>  

<TextBlock TextAlignment="Center"><Run Text=" Green Rectangle"/>  

</StackPanel>  

</Button>



  •  WPF 클래스 계층구조



  • 모든 요소가 컨텐츠(Contents)로 사용될 수 있지만 모두 ContentPropertyAttribute에서 지정하는 특별한 속성을 가지고 있는 것은 아니다. ContentControl을 상속받은 요소(Window, Button, Label등)만 ContentProperty 사용 가능하다.
  • Button의 ContentProperty인 Content 속성은 Object 타입으로 문자열, 객체, UIElement 또는 컨테이너로 설정할 수 있다. 
  • 일부 XAML 객체는 사용할 수 있는 Content 속성이 없을 수 있으므로 속성을 통해 설정해야 한다.

<Button Height="50" Margin="10,10,300,300" Content="Hello XAML" />

<Button Height="50" Margin="10,10,350,310">Hello XAML</Button>


// 아래 TextBox의 Text 속성에 값을 입력하지 않고 태그 사이에 넣어도 

// Text 속성으로 인식하는 것은 ContentProperty로 정의 되었기 때문이다. 

// ContentProperty는 XAML 프로세서가 자식 엘리먼트를 프로세싱할때 

// 사용하는 기본 속성 정보이다.

<TextBox Name="TextBox1" Height="30" Width="200" Text="Hello~"/>

<TextBox Name="TextBox1" Height="30" Width="200" >

  Hello~

</TextBox>


 

#WPF교육, #WPFContentProperty, #컨텐트프로퍼티, #WPF강좌, #XAML, #WPF강의
WPF교육, WPFContentProperty, 컨텐트프로퍼티, WPF강좌, XAML, WPF강의

(C#,WPF강좌, WPF교육, WPF학원)XAML이란,XAML개요

 

(C#,WPF강좌, WPF교육,  WPF학원)XAML이란,XAML개요


2.1 XAML 이란?


http://ojc.asia/bbs/board.php?bo_table=WPF&wr_id=156 


(C#,WPF강좌, WPF교육)XAML이란,XAML개요

(C#,WPF강좌, WPF교육)XAML이란,XAML개요2.1 XAML 이란?MS에서 개발한 Silverlight, WPF, Xamarin 프로그래밍의 추가적인 인터페이스로 객체(Window, Button, TextBox, Grid 등)를 XML 마크업 형태로 정의한다.HTML이 웹 페

ojc.asia

  • MS에서 개발한 Silverlight, WPF, Xamarin 프로그래밍의 추가적인 인터페이스로 객체(Window, Button, TextBox, Grid 등)를 XML 마크업 형태로 정의한다.
  • HTML이 웹 페이지를 시각적으로 표시하기 위해 내부적으로 사용되는 언어인 것처럼, XAML은 응용 프로그램을 시각적으로 표시하기 위해 내부적으로 사용되는 XML 기반의 언어이다.
  • C# 프로그래밍 언어가 아닌 XML 태그를 사용하여 UI를 구성해서 UI와 로직을 분리할 수 있도록 해준다.
  • XAML을 통해서 디자이너가 직접 UI 구성을 할 수 있게 되었고 다이나믹한 화면 구성이 가능해졌다. 즉 개발자, 디자이너가 모두 사용 가능한 중간 형태의 UI를 위한 XML 코드이다.
  • WPF에서 XAML을 무조건 필요로 하는 것은 아니며 XAML 없이 순수한 C#코드로 WPF 클래스들을 이용해서 동적으로 어플리케이션을 만들 수 있다.
  • XAML을 이용하여 XML 코드에서 애니메이션 효과를 구현할 수 있고 이벤트 트리거를 사용하여 사용자의 입력에 동일한 방식으로 응답하도록 구성할 수 있다. 
  • WPF는 벡터 방식 이미지를 지원하므로 크기를 늘려도 계단현상이 발생하지 않는다.


https://www.youtube.com/watch?v=innYXvo9WpA&list=PLxU-iZCqT52Cmj47aKB1T-SxI33YL7rYS&index=2&t=29s 


2.2 XAML vs C# 샘플코드


아래 예문을 참조하자.


[C#]

// StackPanel 생성

StackPanel stackPanel = new StackPanel();

this.Content = stackPanel;  //ContentProperty

 

// TextBlock

TextBlock textBlock = new TextBlock();

textBlock.Margin = new Thickness(10);

textBlock.Text = "Welcome to the World of XAML";

stackPanel.Children.Add(textBlock);

 

// Button

Button button = new Button();

button.Margin= new Thickness(20);

button.Content = "Click Me!";

stackPanel.Children.Add(button);


[XAML]   

<Window>                                                                           <StackPanel>

    <TextBlock Margin="20">Welcome to the World of XAML</TextBlock>

    <Button Margin="10" HorizontalAlignment="Right">OK</Button>

</StackPanel>

</window>


[C# 실습]

Wpf 프로젝트 생성 후 아래 C# 코드 비하인드로 작성해 보자.

 [MainWindow.xaml.cs]

using System;

using System.Text;

using System.Windows;

using System.Windows.Controls;


namespace WpfApplication1

{

    public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

            // Create the StackPanel 

            StackPanel stackPanel = new StackPanel();

            this.Content = stackPanel;


            // Create the TextBlock 

            TextBlock textBlock = new TextBlock();

            textBlock.Text = "Welcome to XAML";

            textBlock.Height = 20;

            textBlock.Width = 200;

            textBlock.Margin = new Thickness(50);

            stackPanel.Children.Add(textBlock);


            // Create the Button 

            Button button = new Button();

            button.Content = "OK";

            button.Height = 20;

            button.Width = 50;

            button.Margin = new Thickness(0);

            stackPanel.Children.Add(button);

        }

    }

}


[XAML]

<Window x:Class="WpfApplication1.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        xmlns:local="clr-namespace:WpfApplication1"

        mc:Ignorable="d"

        Title="MainWindow" Height="350" Width="525">

    <StackPanel Margin="90">

        <TextBlock Text = "Welcome to XAML Tutorial" Height = "20" Width = "200" Margin = "50"/>

        <Button Content = "Ok" Height = "20" Width = "60" Margin = "0"/>

    </StackPanel>

</Window>



#WPFXAML, #XAML이란, #XAML, #WPF교육, #WPF강좌, #WPF학원, #WPF동영상

WPFXAML, XAML이란, XAML, WPF교육, WPF강좌, WPF학원, WPF동영상 

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...