XAML 의 문법구조

(이런것까지 쓰게될 줄은 몰랐어)




시작하는 글


c#, java 또는 html, xml 을 접하던 분들이 처음 xaml 을 보게되면 다소 헷갈리거나 이해가 가지 않는 부분이 있습니다. 정확히 기억은 나지 않지만, 저의 경우 property 와 ContentPresenter 때문에 고생(?)을 했던 것 같네요.

무엇을 배우든 기초가 튼튼하면, 이후 배움에 문제가 없다고 생각합니다. 하여, 이번시간에는 xaml 을 문법(syntax)구조에 대해서 간략히 알아보도록 하겠습니다.




xaml 의 구조


매우 간단한 xaml 코드를 작성해 보려 합니다. 내용(content)가 Hello, World! 인 버튼을 하나 만들어 보도록 하겠습니다.



<Button>Hello, World!</Button>


이렇게 되겠습니다.

그런데 방법이 하나일까요? 아래 나오는 코드들 모두 결과적으로 같은 코드입니다.


<Button Content="Hello, World!"></Button>


<Button>

    <Button.Content>

            Hello, World

    </Button.Content>

</Button>



<Button>

    <Button.Content>

        <TextBlock>Hello, World</TextBlock>

    </Button.Content>

</Button>


위 코드들은 비록 xaml 표현 방식은 달라도, 완벽히 같은 코드입니다.

실제 실행시킨 프로그램의 최종 구조(?)를 볼 수 있는 Snoop 이라는 툴이 있습니다. 이것으로 위 3개의 코드를 실행한 것을 살펴보면 모두 아래처럼 보입니다.




중간에 보시면 아시겠지만, ContentPresenter 라는게 보일 것입니다. 말 그대로 Content 를 보이게 하는 역할을 하는 클래스인데, 이 부분은 추후에 따로 설명 드리도록 하겠습니다.


아무튼 다시 돌아와서, xaml 구조를 살펴보도록 하지요.

3가지 모두 같은 것인데, 왜 코드 표현이 저렇게 다를까요? 이유는 간단합니다. 첫번째 코드는 축약형이라고 생각하시면 됩니다. 두번째 코드는 이를 풀어서 쓴 것이지요.


버튼안에 동그라미(Ellipse)를 넣어 아래와 같은 버튼을 만들어 보도록 하겠습니다.




Button 의 Content 에 Ellipse 를 넣어야 합니다. Ellipse 의 속성으로는 Width, Height 를 50으로 주었습니다. 그리고 Fill 은 Red 로 주었습니다.

첫번째 방식으로 표현하려면 어떻게 해야 할까요?


<Button>

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

</Button>


이렇게 되겠습니다. 다른 방법들로 표현해 볼까요?

<Button Content="<Ellipse Width="50" Height="50" Fill="Red"></Ellipse>"></Button>


가능할까요? 결론부터 말씀드리자면 불가능합니다. 이유는 html 로 이야기하자면, tag 안에 속성(attribute)로 tag 가 들어갈 수 없습니다. 그럼 이런경우 어떻게 해야 할까요? 처음 코드처럼 풀어서 써야 합니다. 전체를 풀어서 쓰면 아래처럼 되겠네요.


<Button>

    <Button.Content>

        <Ellipse>

            <Ellipse.Width>50</Ellipse.Width>

            <Ellipse.Height>50</Ellipse.Height>

            <Ellipse.Fill>

                <SolidColorBrush>Red</SolidColorBrush>

            </Ellipse.Fill>

        </Ellipse>

    </Button.Content>

</Button>


xaml 표현 규칙에 어느정도 감이 오시는지요? 대부분의 경우, 특정 Element 안에 Element 가 들어간 것은, 사실 ContentPresenter 라는 녀석이 생략된 것입니다. 자동으로 들어가는데 생략 가능하다고 생각하시면 될 것 같습니다.

그리고 Property 의 value를 값으로 간략히 표현 가능한 경우는, 한줄로 쓸 수 있으며, 이렇게 쓰기 힘든 경우는 풀어서 쓰면 됩니다.





'Microsoft > WPF' 카테고리의 다른 글

화면에 노출되는 프로퍼티는?  (1) 2014.05.13
TypeConverter  (0) 2014.05.12
xaml 과 cs 파일의 관계  (1) 2014.05.08
WPF 기본 동작구조  (0) 2014.05.08
WPF 3D Tutorial  (7) 2011.04.09