티스토리 뷰

컴퓨터과학

[WPF] x:Name 과 Name 의 차이

신-동화 2016. 4. 12. 11:59

What is the difference between 'x:Name' and 'Name' in WPF?


오늘도 룰루랄라 .Net 작업중에 다음과 같은 문제에 부딪혔다. 


Error 원문: "Because 'MetaCore' is implemented in the same assembly, you must set the x:Name attribute rather than the Name attribute."



해석해보자면, MetaCore 것이 현재 동일한 assembly에 구현되어 있으니까

'Name' 대신 'x:Name' 을 쓰라는 것이었다.

위의 에러를 불러일으킨 원인이 되는 코드는 다음과 같았다.





현재 작업중인 프로젝트 내에서 "MetaCore" 라는 UserControl을 만들었드랬다.

그래서 이를 사용하려고 xaml 상에서 MetaCore를 위의 코드와 같이 배치를 시킨 뒤,

'Name' Property를 지정하고, 빌드를 했더니 에러가 발생한 것이다.



에러를 고치는 방법은 정말 간단하다. 

에러 텍스트에서도 나와있듯이 그저 'Name' Property 를 'x:Name'으로 바꿔주면 끝이다.



그렇다면 여기서 한 가지 의문이 든다.

도대체 'Name' 과 'x:Name' 의 차이는 무엇일까?



구글링을 해 본 결과, 사실 둘의 차이점은 그리 복잡하지 않았다.


Name

-> WPF 내의 FrameworkElement가 갖는 Property 의 하나이다.

Binding 등의 WPF의 주된 특징들을 수행하기 위해서

(Xaml 코드 상에서 뿐 아니라) Runtime 에도 계속 보존되어야 할 Property가 필요했던 것.

대부분의 WPF UIElement들은 FrameworkElement를 상속받고 있으며, 

때문에 덩달아서 Name 이라는 Property까지 상속 받기에

이를 사용하여 Binding 등의 작업을 할 수 있는 것이다.


x:Name

-> XAML 상에서 각각의 Item 들에게 이름을 붙여줄 수 있는 Attribute로서,

단순히 이름을 붙여줌과 동시에 핵심 기능은 

Code-behind 에서 해당 Item을 참조할 수 (사용할 수) 있는 Field를 만들어주는 것이다. 

당연히 Field의 이름은 x:Name에다가 사용자가 지정한 이름이다.

그래서 우리가 XAML에서 선언한 UIElement를 Code-behind에서도 손쉽게 Refer 하여

쓸 수 있었던 것이다!



어 잠깐만?? 나는 Name을 썼는데도 Code-behind 에서 UIElement 참조 되던데?

나는 x:Name 썼는데도 Binding 잘 되던데?



위의 설명과는 달리 우리는 평소에 Name과 x:Name을 섞어서 써도 전혀 지장없이

잘 코딩을 하고 있다 (...)



그러한 이유는 친절하게도 WPF Framework 자체가

Name과 x:Name을 하나로 Mapping 시켜주어서, 어떤 걸 사용하더라도

본래 WPF의 Name의 기능과 XAML의 x:Name의 기능을 다 수행할 수 있도록 해준 탓이다.


그러니까 결론은 평소에는 아무거나 써도 상관없다.



단,  XAML 상에서 UIElement 가 아니라서 (FrameworkElement의 상속을 받지 않아서)

애초에 해당 Class 의 Item이 'Name' 이라는 Property를 가지고 있지 않을 경우는

x:Name 을 써주면 되겠다.



또한, 이 모든 논의의 시발점이었던 에러

"동일한 어셈블리에서는 Name 이 아닌 x:Name을..."

이는 동일한 어셈블리 (프로젝트) 내에서 해당 UserControl을 정의하는 부분이 있을 경우

이는 다음과 같이 요약된다.



지금 내 XAML을 빌드하기 위해선 이 UserControl의 Name Property에 ~~~ 를 지정해 주어야해!

그런데 UserControl의 명세는 어떻게 되지? (Name Property 갖고있니?)

그건 우리 프로젝트를 빌드해야 알지!

지금 빌드하고 있잖아...

이렇게 꼬리를 무는 문제로 이어질 수 있기에

XAML Parser 단에서 그냥 UserControl은 Name 대신

XAML 단에서의 Name인 x:Name을 쓰도록 규칙을 세운 것.



따라서 

1. XAML Item이 'Name' Property를 갖고있지 않은 경우

2. 동일 프로젝트 내에 명세가 있는 UserControl에 Name을 주고 싶을 경우

두 가지 경우에 대해 Name 대신 x:Name을 사용하면 되겠다는 결론.

(아... 그냥 매번 x:Name 사용하는게 편하겠다.)



참고

( http://stackoverflow.com/questions/589874/in-wpf-what-are-the-differences-between-the-xname-and-name-attributes )

( http://stackoverflow.com/questions/1380112/why-cant-i-use-the-name-attribute-on-usercontrol-in-the-same-assembly )





댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함