본문 바로가기

Silverlight

FindName()에 관한 이야기

요즘 이런저런 내용 전파에 관한 글만 썼었는데요, 이번에는 오랜만에 기술 포스팅을 해볼까 합니다. :-D

우선, 현재 상황에 대해서 간단히 말씀 드리고 시작 하도록 하겠습니다.

 

보시는 것처럼 MainPage에 1개의 UserControl 과 1개의 Rectangle이 있다고 가정 하겠씁니다.

예전에 사용 했던 방식으로 두 컨트롤을 움직이게 하고 싶을 때, 우리는 xaml 상에서 각각의 컨트롤에 CompositeTransform을 생성 하고 거기에 이름을 부여한 다음에 cs단에서 사용 하고는 했었죠 다음과 같이 말이에요.

In XAML

in Code

위의 사각형에 RenderTransform에 compositeTransform이라는 이름을 주고 값 변경이 잘 됩니다.
문제는UserControl에서 발생 하게 됩니다.
똑같이 UserControl에 CompositeTransform을 xaml에서 생성하고 거기다가 이름을 주도록 하겠습니다.

in XAML

동일하게 이름을 주었습니다.

그리고 code단에서 사용해 보도록 하겠습니다.

in Code

코드단에서도 위의 usercontrol의 RenderTransform에 준 이름인 compositeTrasnform1을 알고 컴파일시에도 문제 없이 잘 작동 합니다.

하지만 실제로 실행해 보면 어떻게 될까요? 우선 실행을 해보도록 하겠습니다.

오잉 보이시나요? rectangle에 준 compositeTransform은 잘 넘어갔는데 반해 UserControl에 준 compositeTransform1은 null Excepton을 날려 주고 있습니다.

머가 다를까요? 어째서 모를까요?

비밀은 제목에 적어놓은 FindName함수에 숨어 있습니다.

MainPage.xaml.cs 의 생성자에 보시면 IntializeComponent()함수가 있고 함수안을 확인해 보면 xaml에서 이름을 준 객체들에 대해서 FindName을 통해서 찾아다가 동일한 이름의 객체를 만들어서 우리가 cs코드에서 사용 할 수 있도록 해주고 있는데요.

보시는 것처럼 compositeTransform1과 compositeTransform둘 다 정상적으로 찾아 오고 있는 것처럼 보입니다.
그럼 FindName함수를 살짝 확인해 볼까요?

 

Returns에 보시면 현재XAML읠 namespace안에 matching된 객체가 없다면 null이 넘어 간다고 되어 있습니다.
이런 내용을 확인 하고 mainpage.xmaml을 확인해 볼까요?

위에서 보시는 것처럼 userControl의 경우 local 이라는 NameSpace을 사용 하고 있습니다. 그렇기 때문에 this.FindName으로 찾아오는 InitializeComponet에서는 찾아올 수가 없습니다.

사실 위의 경우는 FindName에 관한 함수 사용시 조심해야 할 내용을 설명 드리기 위해서 저렇게 compositeTransform에다가 이름을 주었지만, RenderTransfrom 같은경우는 VisaulState나 Storyboard사용시 사용 하게 되면 새롭게 RenderTransfrom가 할당 되므로 항상 객체에서 직접 다시 가져와 쓰도록 구현되어야 합니다 :-D

 

그럼 즐프 하세용