x:Name 지시문
XAML 이름 범위에서 XAML 정의 요소를 고유하게 식별합니다. 프레임워크가 API를 제공하거나 런타임에 XAML에서 만든 개체 그래프에 액세스하는 동작을 구현할 때 XAML 이름 범위와 그 고유성 모델을 인스턴스화된 개체에 적용할 수 있습니다.
XAML 특성 사용
<object x:Name="XAMLNameValue".../>
XAML 값
값 | 설명 |
---|---|
XAMLNameValue |
XamlName 문법의 제한을 따르는 문자열입니다. |
설명
x:Name
이 프레임워크의 지원 프로그래밍 모델에 적용된 후, 이름은 생성자가 반환하는 개체 참조 또는 인스턴스를 보유하는 변수와 동일합니다.
x:Name
지시문 사용의 값은 XAML 이름 범위 내에서 고유해야 합니다. 기본적으로 .NET XAML Services API에서 사용하는 경우, 기본 XAML 이름 범위는 단일 XAML 프로덕션의 XAML 루트 요소에 정의되며 해당 XAML 프로덕션에 포함된 요소를 포함합니다. 단일 XAML 프로덕션 내에서 발생할 수 있는 추가 불연속 XAML 이름 범위는 특정 시나리오를 해결하기 위해 프레임워크에서 정의할 수 있습니다. 예를 들어 WPF에서 새 XAML 이름 범위는 해당 XAML 프로덕션에서도 정의된 템플릿에 의해 정의되고 만들어집니다. (WPF용으로 작성되었지만 많은 XAML 이름 범위 개념과 관련된) XAML 이름 범위에 관한 자세한 내용은 WPF XAML 이름 범위를 참조하세요.
일반적으로 x:Key
도 사용하는 상황에서는 x:Name
을 적용해서는 안 됩니다. 특정 기존 프레임워크에 의한 XAML 구현에서는 x:Key
와 x:Name
간에 대체 개념을 도입했지만 이는 권장되는 방법은 아닙니다. .NET XAML 서비스는 INameScope 또는 DictionaryKeyPropertyAttribute와 같은 이름/키 정보를 처리할 때 이러한 대체 개념을 지원하지 않습니다.
이름 고유성 적용뿐만 아니라 x:Name
의 허용에 대한 규칙은 특정 구현 프레임워크에 의해 정의될 수 있는 여지가 있습니다. 그러나 .NET XAML 서비스에서 사용할 수 있도록 하려면 XAML 이름 범위 고유성의 프레임워크 정의는 이 설명서의 INameScope 정보 정의와 일치해야 하며 해당 정보가 적용되는 위치에 대해 동일한 규칙을 사용해야 합니다. 예를 들어 WPF(Windows Presentation Foundation) 구현은 리소스 사전, 페이지 수준 XAML에서 만든 논리 트리, 템플릿 및 그 외 지연된 콘텐츠 등 다양한 태그 요소를 별개의 NameScope 범위로 나눈 다음, 그러한 각각의 XAML 이름 범위 내에서 XAML 이름 고유성을 적용합니다.
.NET XAML 서비스 XAML 개체 작성기를 사용하는 사용자 지정 형식의 경우, 한 형식의 x:Name
에 매핑되는 속성을 설정하거나 변경할 수 있습니다. 형식 정의 코드에서 RuntimeNamePropertyAttribute를 사용하여 매핑할 속성의 이름을 참조하여 이 동작을 정의합니다. RuntimeNamePropertyAttribute는 형식 수준 특성입니다.
XAML 이름 범위 지원을 위한 지원 논리는 .NET XAML 서비스를 사용하면서 INameScope 인터페이스를 구현하여 프레임워크 중립적인 방식으로 정의할 수 있습니다.
WPF 사용 정보
XAML, partial 클래스 및 코드 숨김을 사용하는 WPF 애플리케이션에 대한 표준 빌드 구성에서 지정된 x:Name
은 태그 컴파일 빌드 작업에서 XAML을 처리할 때 기본 코드에서 생성되는 필드의 이름이 되며 해당 필드는 개체에 대한 참조를 유지합니다. 기본적으로 생성된 필드는 내부 필드입니다. x:FieldModifier 특성을 지정하여 필드 액세스를 변경할 수 있습니다. WPF 및 Silverlight에서 시퀀스는 태그 컴파일이 partial 클래스의 필드를 정의하고 이름을 지정하지만 처음에는 값이 비어 있다는 것입니다. 그런 다음, InitializeComponent
라는 이름의 생성된 메서드가 클래스 생성자 내에서 호출됩니다. InitializeComponent
는 partial 클래스의 XAML 정의 부분에 있는 각 x:Name
값을 입력 문자열로 사용하는 FindName
호출로 구성됩니다. 그런 다음, 반환 값은 이름이 같은 필드 참조에 할당되어 필드 값을 XAML 구문 분석에서 만든 개체로 채웁니다. InitializeComponent
를 실행하면 XAML 정의 개체에 대한 참조가 필요할 때마다 FindName
을 명시적으로 호출할 필요 없이 x:Name
/필드 이름을 직접 사용하여 런타임 개체 그래프를 참조할 수 있습니다.
Microsoft Visual Basic 대상을 사용하며 Page
빌드 작업과 함께 XAML 파일을 포함하는 WPF 애플리케이션의 경우, 컴파일 중에 이벤트 처리기 대리자의 Handles
구문을 지원하기 위해 x:Name
을 포함하는 모든 요소에 WithEvents
키워드를 추가하는 별도의 참조 속성이 생성됩니다. 이 속성은 항상 public입니다. 자세한 내용은 Visual Basic 및 WPF 이벤트 처리를 참조하세요.
x:Name
은 WPF XAML 프로세서에서 빌드 작업(예: 리소스 사전의 느슨한 XAML)에 의해 페이지가 태그 컴파일되지 않은 경우에도 로드 시 XAML 이름 범위에 이름을 등록하는 데 사용됩니다. 이 동작의 한 가지 이유는 ElementName 바인딩에 x:Name
이 잠재적으로 필요하기 때문입니다. 자세한 내용은 데이터 바인딩 개요를 참조하세요.
앞서 언급했듯이 x:Name
(또는 Name
)은 x:Key
도 함께 사용하는 상황에서는 적용하면 안 됩니다. WPF ResourceDictionary는 그 자체를 XAML 이름 범위로 정의하지만 이 동작을 적용하는 방법으로 INameScope API에 대해 구현되지 않음 또는 null 값을 반환하는 특별한 동작이 있습니다. WPF XAML 파서가 XAML 정의 ResourceDictionary에서 Name
또는 x:Name
을 발견하면 그 이름은 어떠한 XAML 이름 범위에도 추가되지 않습니다. XAML 이름 범위와 FindName
메서드에서 해당 이름을 찾으려고 하면 유효한 결과가 반환되지 않습니다.
x:Name과 이름
많은 WPF 애플리케이션 시나리오는 x:Name
특성의 사용을 방지할 수 있습니다. 그 이유는 FrameworkElement 및 FrameworkContentElement등과 같이 몇몇 중요한 기본 클래스에 대해 기본 XAML 네임스페이스에 지정된 Name
종속성 속성이 이와 동일한 목적을 충족하기 때문입니다. 프레임워크 수준에서 Name
속성이 없는 요소에 대한 코드 액세스가 중요한 몇 가지 일반적인 XAML 및 WPF 시나리오가 여전히 있습니다. 예를 들어, 특정 애니메이션 및 스토리보드 지원 클래스는 Name
속성을 지원하지 않지만 애니메이션을 제어하기 위해 코드에서 참조해야 하는 경우가 많습니다. 나중에 코드에서 참조하려는 경우, XAML에서 만든 타임라인 및 변환에서 x:Name
을 하나의 특성으로 지정해야 합니다.
Name을 클래스에서 하나의 속성으로 사용할 수 있다면 Name과 x:Name
은 특성으로서 서로 바꿔 사용할 수 있으며 다만 둘 다 동일한 요소에 지정될 경우에는 구문 분석 예외가 발생합니다. XAML이 태그 컴파일된 경우, 태그 컴파일에서 예외가 발생하며 그렇지 않으면 로드 시 예외가 발생합니다.
Name은 XAML 특성 구문을 사용하여 설정할 수 있으며 SetValue를 사용하는 코드에서 설정할 수 있습니다. 그러나 코드에서 Name 속성을 설정하면 XAML이 이미 로드된 대부분의 상황에서 XAML 이름 범위 내에 대표 필드 참조가 생성되지 않습니다. 코드에서 Name을 설정하려고 시도하는 대신, 적절한 이름 범위에 대해 코드의 NameScope 메서드를 사용합니다.
Name은 내부 텍스트와 함께 속성 요소 구문을 사용하여 설정할 수도 있지만 이는 일반적이지 않습니다. 반면 XAML 속성 요소 구문이나 코드에서는 SetValue를 사용하여 x:Name
을 설정할 수 없습니다. 이것은 지시문이기 때문에 개체에 대한 특성 구문을 사용하여 설정할 수 밖에 없습니다.
Silverlight 사용 정보
Silverlight의 x:Name
은 별도로 문서화됩니다. 자세한 내용은 XAML 네임스페이스(x:) 언어 기능(Silverlight)을 참조하세요.
참고 항목
.NET Desktop feedback