xaml 과 cs 파일의 관계






이쯤에서 "WPF 는 C#코드 없이 XAML 만 가지고 동작이 가능한가?" 라는 질문에 대해서 테스트 해 보도록 하겠습니다.

코드는 본래 처음으로 되돌리고, MainWindow.xaml 을 수정해 보겠습니다.



버튼을 넣어 봅시다.


먼저 Window 에 버튼을 하나 넣도록 하겠습니다.



    [MainWindow.xaml]


<Window x:Class="WPFApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Content="My Button"/>
    </Grid>
</Window>





실행하면 버튼이 들어있는 창이 보입니다.






*.cs 를 삭제하고, xaml 만 남겨 봅시다.



이제, 소스코드에서 x:Class 부분을 삭제하고, 탐색기에서 MainWindow.cs 파일도 삭제합니다.

더불어 App.cs 도 삭제합니다.


    [x:Class 삭제]


<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Content="My Button"/>
    </Grid>
</Window>








보시는 것 처럼, xaml 파일 두개만 남았습니다.

모든 *.cs 파일을 삭제하였습니다.

(사실 App.xaml 은 지난번 테스트했듯이, 내부적으로 cs 파일이 생성됩니다.)



빌드하고, 실행합니다.


어떤가요?

처음 실행했을 때와 동일하게 정상적으로 프로그램이 실행됩니다.



순수하게 UI 만 구성하기 위해서는 CS 파일이 필요가 없다는게 확인 되었네요.

다시말해 View 와 Controller 가 분리되어 있다고 할 수 있겠습니다.




*.cs 파일은 어떤 경우에 필요한가?


그럼 *.cs 파일은 어떤 경우 필요할까요?

버튼 클릭시 메세지박스가 뜨도록 해 봅시다.



    [click 이벤트 추가]


<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Content="My Button" Click="OnButtonClick"/>
    </Grid>
</Window>



이벤트 핸들러는 달았으나, 구현할 방법이 없습니다.

x:Class 를 추가해 봅시다.



    [x:Class 추가]


<Window x:Class="WPFApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Content="My Button" Click="OnButtonClick"/>
    </Grid>
</Window>




MainWindow.cs 파일을 생성해 준 뒤, 빌드를 하면, 자동으로 xaml 과 코드가 연결됩니다.

핸들러는 MessageBox 가 뜨도록 작성하였습니다.



    [MainWindow.cs]


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;


namespace WPFApplication
{
    public partial class MainWindow : System.Windows.Window
    {
        public MainWindow()
        {
            this.InitializeComponent();
        }


        private void OnButtonClick(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Clicked");
        }
    }
}




이제 xaml 로부터 어떤 코드가 자동으로 작성되었는지 확인해 보겠습니다.


    [MainWindow.g.i.cs]


namespace WPFApplication {
    
    
    /// <summary>
    /// MainWindow
    /// </summary>
    public partial class MainWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
        
        private bool _contentLoaded;
        
        /// <summary>
        /// InitializeComponent
        /// </summary>
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
        public void InitializeComponent() {
            if (_contentLoaded) {
                return;
            }
            _contentLoaded = true;
            System.Uri resourceLocater = new System.Uri("/WPFApplication;component/mainwindow.xaml", System.UriKind.Relative);
            
            #line 1 "..\..\MainWindow.xaml"
            System.Windows.Application.LoadComponent(this, resourceLocater);
            
            #line default
            #line hidden
        }
        
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
        [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
        [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
        [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
        void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
            switch (connectionId)
            {
            case 1:
            
            #line 6 "..\..\MainWindow.xaml"
            ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.OnButtonClick);
            
            #line default
            #line hidden
            return;
            }
            this._contentLoaded = true;
        }
    }
}



보시는것처럼, IComponentConnector 에 있는 두개의 메소드가 자동 구현되었습니다.

각 메소드가 하는 일은 MSDN 을 찾아보면 쉽게 알 수 있습니다.




Connect 는 말 그대로 x:Name 이나 Click 과 같이, 이름 또는 이벤트를 연결해 주는 코드를 생성합니다.

그리고 InitializeComponent 는 컴파일된 페이지의 컴퍼넌트들을 로드합니다.



즉, 핵심코드는 다음 두 줄이 되겠습니다.


System.Uri resourceLocater = new System.Uri("/WPFApplication;component/mainwindow.xaml", System.UriKind.Relative);

System.Windows.Application.LoadComponent(this, resourceLocater);



((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.OnButtonClick);




결론


요컨데, xaml 은 wpf(view) 의 핵심이며, *.cs 파일(x:Class 에 선언된)을 Logic 을 위한 코드정도가 되겠네요.





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

TypeConverter  (0) 2014.05.12
XAML 의 문법구조  (0) 2014.05.12
WPF 기본 동작구조  (0) 2014.05.08
WPF 3D Tutorial  (7) 2011.04.09
Animated Image  (0) 2010.12.10