2

작은 Silverlight 3 테스트 응용 프로그램이 있습니다. Silverlight, XAML, 바인딩 등을 배우는 연습입니다. 세 가지 속성이있는 작은 테스트 클래스 (Test)가 있습니다. Val1, Val2 및 Sum. 다음과 같이 XAML의 리소스를 선언했습니다.xaml에서 정적 res로 선언 된 사용자 정의 obj를 참조하는 것은 null입니다. 왜?

<UserControl.Resources> 
    <app:Test x:Name="xamlTestObj"></app:Test> 
</UserControl.Resources> 

나는 사용자 정의 컨트롤에 단추가 있습니다. 이 솔루션을 성공적으로 구축,하지만 난 그것을 실행할 때 xamlTestObj를 참조 할 때 내가 단추 처리기에서 NullReferenceException이 얻을

 xamlTestObj.Val1 += 100; 
     xamlTestObj.Val2 += 300; 

:이 버튼 뒤에 코드처럼 보인다. 사용자 컨트롤의 리소스 목록에서 개체를 꺼낸 경우 성공적으로 단추를 클릭 할 수있었습니다. Like :

 Test xamlTestObj = (Test)Resources["xamlTestObj"]; 
     xamlTestObj.Val1 += 100; 
     xamlTestObj.Val2 += 300; 

나를 혼란스럽게하는 이유는 리소스 목록에서 개체를 꺼내야하는 이유입니다. 컴파일러가 xamlTestObj 참조를 볼 수 있다면 그것이 선언 된 범위의 수명 동안 (이 경우 사용자 정의 컨트롤에서) "실행"되어야한다는 것입니다. WPF 컨트롤은 이러한 방식으로 작동합니다. 즉, 사용자 정의 컨트롤에 배치 한 모든 텍스트 상자 및 단추에 액세스 할 수 있습니다.

누구나 나를 위해 이것을 정리할 수 있습니까?

답변

1

:-)

덕분에 지금까지 내가 아는 한, 시각적 트리에서만 요소는 InitializeComponents 방법의 해당 필드에로드됩니다. 리소스는 시각적 트리의 일부가 아니며 필요한 경우에만로드되므로 해당 필드는 null로 유지됩니다.

그런데

, 당신은 자원에 대한 x:Key보다는 x:Name 사용해야 토마스가 말하고자하는 것은 무엇

+1

가 UserControl.Resources에 선언 된 사용자들은 물건이 this.Resources 통해서만 액세스 [ "SomeResource"] 인덱서 xamlTestObj 속성을 표시하는 유일한 이유는 ax : Name을 지정했기 때문입니다.하지만 xaml은 생성자의 InitializeComponents()가 호출 될 때 콘텐츠 영역 () 내에있는 요소 만로드합니다. 리소스는 내용 영역의 일부가 아닙니다 그러므로 당신의 행동 – Neil