2009-09-04 2 views
26
나는 WPF UserControl를 생성하고 그것을 사용하려고

, 나는 다음과 같은 컴파일러 오류 가지고 :동일한 어셈블리에서 UserControl의 Name 특성을 사용할 수없는 이유는 무엇입니까?

Because 'UserControl1' is implemented in the same assembly, you must set the x:Name attribute rather than the Name attribute.

메시지는 그것을 해결하기 위해 무엇을해야하는지에 분명하지만, 그 원인은 무엇입니까? Name을 사용할 수 없나요?

답변

29

x : 이름은 단순히 "이 특정 XML 네임 스페이스의 이름 특성"을 더 명확하게 표현한 것입니다. WPF가이 힌트를받지 않고 컴파일 할 수 없다는 사실은 동일한 어셈블리에 있기 때문에 파서를 작성하는 방법의 한계에 불과합니다.

왜 이런 식인지 묻는다면, 나는 그것을 쓰지 않았기 때문에 확실하지 않습니다. 아마도 UserControl1을 빌드하기 전에 구체적으로 Name 속성 (읽기 : Dependency Property)을 해결할 필요가있는 것과 관련이 있습니다 (즉, catch-22).

7

처음에는 .net 개체의 "트리"를 만들 수 있도록 XAML 컴파일러가 작성되었으므로 Microsoft에는 XAML을 사용하는 101 개의 프로젝트가있었습니다. XAML 컴파일러는 WPF에 대해 아무것도 모릅니다.

"Name"속성은 WPF에 의해 정의되며 XAML 컴파일러에서는 알 수 없습니다. WPF는 name 속성을 XAML 컴파일러에서 지원하는 "Name TAG"와 동일하게 매핑합니다. "x : name"의 "x"는 XAML xml 스키마에서 정의한대로 "name"을 사용하고, "Name"은 지정된 개체에서 "name"이라는 속성을 찾습니다. 자세한 내용은 In WPF, what are the differences between the x:Name and Name attributes?을 참조하십시오.

XAML 컴파일러는 사용자 정의 컨트롤을 정의하는 어셈블리를로드 할 필요없이 사용자 정의 컨트롤로 수행 할 수있는 작업이 매우 제한적입니다. 어셈블리를로드하기 전에 XAML을 컴파일해야하므로 xaml 컴파일러는 동일한 어셈블리에 구현 된 컨트롤에 대해 어셈블리를로드 할 수 없습니다. 따라서 XAML 컴파일러는 항목이 사용자 정의 컨트롤이라는 것을 알지 못합니다.

XAML 컴파일러 그냥 말할 수

Properties that are defined on a user control (or its parent class) can therefore not be accessed. “Name” is a property that is defined in the parent (or super-parent) of a custom control.

"이름은 속성으로 정의되어 있지 않습니다"; 그렇다면 얼마나 많은 사람들이 간단한 사용자 정의 컨트롤을 작동시키지 못할지 생각해보십시오! 따라서 XAML 컴파일러에는 코드의 의미를 "추측하여"보다 유용한 오류 메시지를 제공하는 특별한 경우가 있습니다. 그것의 추측은 대체로 정확합니다.

가장 단순한 사용자 정의 컨트롤을 제외하고는 자체 어셈블리에 있어야하지만 사용자 단순 제어는 매우 일반적이므로 특별한 경우가 유용 할 수 있습니다.

+2

'따라서 사용자 정의 컨트롤 (또는 상위 클래스)에 정의 된 속성에 액세스 할 수 없습니다.' - 그건 나에게 의미가 없다. 기본 클래스에 정의 된 다른 속성을 설정하면''이되므로 컴파일러가 WPF 속성의 이름을 같은 방식으로 설정할 수없는 이유를 모르겠습니다. – nevermind

관련 문제