본문 바로가기

Dev::DotNet/WPF

XmlnsDefinition 을 통한 namespace 매칭

WPF 프로젝트를 만들어서 Window 를 만들면


<Window x:Class="WpfApplication1.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>

       

    </Grid>

</Window>


이런 Xaml 코드가 생긴 것을 볼 수 있다.


처음 WPF 를 접하면 "xmlns" 과 "xmlns:x" 가 약간 낯설다.

조금만 공부하면 저것들이 namespace 를 Xaml 코드에서 사용하기 위해서 정의한 것임을 알 수 있다.


참고> xmlns 기본 네임스페이스와 닷넷 네임스페이스의 맵핑 구조


wpf 에서는 xmal 에서 여러 DLL 에 정의된 namespace에 접근하기 위해서

XmlnsDefinition 을 통해서 몇 개의 URL 로 정의하여 매칭시켜놓았다.


[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml", "System.Windows.Markup")]
[assembly: XmlnsPrefix("http://schemas.microsoft.com/winfx/2006/xaml", "x")]


그리고 다른 namespace 에 정의된 것을 사용하려면 그 사용할 namespace 를 xmlns 를 통해서 특정한 이름에

매칭해주고 사용을 해야 한다.


<Window x:Class="WpfApplication1.MainWindow"

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

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

        xmlns:My="clr-namespace:WpfApplication2"

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

    <Grid>

        <My:MyControl />

    </Grid>

</Window>


하지만 하다 보면 자주 사용하는 것의 경우, 
예를 들어 사용자가 팝업 윈도우를 만들었다거나, 버튼 컨트롤 같은 것을 재정의 했다거나...등등 
자주 사용하는 것에 대해서는 저렇게 일일이 namespace를 매칭하고 사용하는 것에 귀차니즘이 발동할 수 있다.

그러면 "XmlnsDefinition" 을 이용하여 사용자의 namespace를 기본 namespace에 통합시키면 된다.

AssemblyInfo.cs 에

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "WpfApplication2")]


이런 코드를 추가하면 특정 namespace를 기본 namespace로 통합시킬 수 있다.


<Window x:Class="WpfApplication1.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>

        <MyControl />

    </Grid>

</Window>


이렇게 별도의 namespace 선언 없이 바로 사용이 가능하다.

무분별하게 사용하면 충돌이 날 수도 있지만 잘 선별해서 사용하면 꽤 유용하게 쓸 수 있다. 


단, 위의 예시에서 사용된 namespace 들을 보면 알 수 있겠지만 

XmlnsDefinition 을 통해서 namespace 를 통합했을 경우, 동일한 프로젝트에서는 적용이 안 된다.

그 프로젝트를 다른 곳에서 참조했을 경우에만 제대로 인식이 되는 문제가 있으니 

동일한 프로젝트에서는 namespace를 명시적으로 사용하여야 한다.