Share via


XAML 구문 정보

이 항목에서는 XAML 구문의 요소를 설명하는 데 사용되는 용어를 정의합니다. 이러한 용어는 이 문서의 나머지 부분, 특히 WPF 설명서 및 System.Xaml 수준의 XAML 언어 지원에 의해 활성화되는 XAML 또는 기본적 XAML 개념을 사용하는 기타 프레임워크에 대한 부분에서 자주 사용됩니다. 이 항목에서는 XAML 개요(WPF) 항목에서 소개한 기본 용어를 바탕으로 설명합니다.

이 항목에는 다음 단원이 포함되어 있습니다.

  • XAML 언어 사양
  • XAML 및 CLR
  • 개체 요소 구문
  • 개체 요소 속성
  • 특성 구문(속성)
  • 속성 요소 구문
  • 컬렉션 구문
  • XAML 콘텐츠 속성
  • 콘텐츠 속성 및 컬렉션 구문 조합
  • XAML 네임스페이스
  • 태그 확장
  • 연결된 속성
  • 연결된 이벤트
  • XAML 루트 요소 분석
  • 선택적 및 권장하지 않는 XAML 사용법
  • 관련 항목

XAML 언어 사양

여기에서 정의하는 XAML 구문 용어는 XAML 언어 사양 내에서도 정의 또는 참조됩니다. XAML은 XML을 기반으로 하는 언어로 XML 구조 규칙을 따르거나 확장합니다. 용어 중 일부는 XML 언어 또는 XML 문서 개체 모델을 설명할 때 일반적으로 사용되는 용어를 공유하거나 기반으로 합니다.

XAML 언어 사양에 대한 자세한 내용을 보려면 Microsoft 다운로드 센터에서 [MS-XAML]을 다운로드하십시오.

XAML 및 CLR

XAML은 태그 언어입니다. common language runtime (CLR)은 이름에서 의미하듯이 런타임 실행을 가능하게 합니다. XAML 자체는 CLR 런타임에서 직접 사용되는 공용 언어가 아닙니다. 대신 XAML은 그 자체의 형식 시스템을 지원한다고 간주할 수 있습니다. WPF에서 사용하는 특정 XAML 구문 분석 시스템은 CLR 및 CLR 형식 시스템을 기반으로 구축됩니다. WPF의 XAML이 구문 분석될 때 런타임 표현을 인스턴스화하기 위해 XAML 형식이 CLR 형식으로 매핑됩니다. 이로 인해 XAML 언어 사양의 해당 구문 설명에 CLR 형식 시스템에 대한 참조가 포함되지 않은 경우에도 이 문서의 구문 설명에는 CLR 형식 시스템에 대한 참조가 포함됩니다. XAML 언어 사양 수준별로 XAML 형식은 CLR 이외에도 다른 형식 시스템으로 매핑될 수 있지만, 이를 위해서는 다른 XAML 파서를 만들어 사용해야 합니다.

형식 및 클래스 상속의 멤버

WPF 형식의 XAML 멤버로 나타나는 속성과 이벤트는 대개 기본 형식에서 상속됩니다. 예를 들어, <Button Background="Blue" .../> 예제를 생각해 볼 수 있습니다. 클래스 정의, 리플렉션 결과 또는 문서를 확인하더라도 Background 속성은 Button 클래스에서 곧바로 선언된 속성이 아닙니다. Background는 기본 Control 클래스에서 상속되었습니다.

WPF XAML 요소의 클래스 상속 동작은 XML 태그의 스키마 적용 해석과 큰 차이를 나타냅니다. 클래스 상속은 특히 중간 기본 클래스가 추상 클래스이거나 인터페이스가 포함된 경우에 복잡해질 수 있습니다. 이는 XAML 요소 및 해당 허용 가능한 특성 집합을 DTD 또는 XSD 형식과 같이 XML 프로그래밍에 일반적으로 사용되는 스키마 형식을 사용하여 정확하고 완전하게 표현하기 어렵게 하는 요인 중 하나입니다. XAML 언어 자체의 확장성 및 형식 매핑 기능 때문에 허용되는 형식 및 멤버에 대한 고정 표현이 불완전하다는 것 역시 이러한 요인 중 하나입니다.

개체 요소 구문

개체 요소 구문은 XML 요소를 선언하여 CLR 클래스 또는 구조체를 인스턴스화하는 XAML 태그 구문입니다. 이 구문은 HTML과 같은 다른 태그 언어의 요소 구문과 비슷합니다. 개체 요소 구문은 왼쪽 꺾쇠 괄호(<)로 시작되며 인스턴스화되는 클래스나 구조체의 형식 이름이 그 뒤에 나옵니다. 형식 이름 뒤에는 공백이 없거나 1개 이상의 공백이 올 수 있고, 개체 요소에 대해서도 특성을 선언하지 않거나 1개 이상의 특성을 선언할 수 있습니다. 이때 각 특성 이름="값" 쌍은 하나 이상의 공백으로 구분합니다. 마지막으로 다음 중 하나가 적용되어야 합니다.

  • 요소 및 태그를 닫을 때는 플래시(/) 다음에 바로 이어 오른쪽 꺾쇠괄호(>)를 붙여야 합니다.

  • 여는 태그는 오른쪽 꺾쇠괄호(>)로 끝나야 합니다. 여는 태그 뒤에는 다른 개체 요소, 속성 요소 또는 내부 텍스트가 올 수 있습니다. 여기에 포함될 수 있는 항목은 일반적으로 요소의 개체 모델에 따라 달라집니다. 개체 요소에는 동등한 닫는 태그도 있어야 하며, 이때 닫는 태그는 다른 여는 태그/닫는 태그 쌍과 적절한 중첩을 이루고 균형이 맞아야 합니다.

.NET에서 구현하는 XAML에는 개체 요소를 형식으로, 특성을 속성이나 이벤트로, XAML 네임스페이스를 CLR 네임스페이스와 어셈블리로 매핑하는 규칙 집합이 있습니다. WPF 및 .NET Framework의 경우 XAML 개체 요소는 참조된 어셈블리에 정의된 대로 Microsoft .NET 형식으로 매핑되며 특성은 해당 형식의 멤버로 매핑됩니다. XAML에서 CLR 형식을 참조하는 경우 해당 형식의 상속된 멤버에도 액세스할 수 있습니다.

예를 들어 다음 예제는 Button 클래스의 새 인스턴스를 인스턴스화하면서 동시에 Name 특성과 이 특성의 값을 지정하는 개체 요소 구문입니다.

<Button Name="CheckoutButton"/>

다음 예제는 XAML 콘텐츠 속성 구문도 포함된 개체 요소 구문입니다. 안에 포함된 내부 텍스트는 TextBox XAML 콘텐츠 속성 Text를 설정하는 데 사용됩니다.

<TextBox>This is a Text Box</TextBox>

콘텐츠 모델

클래스는 구문의 측면에서 XAML 개체 요소로 사용되는 것을 지원할 수 있지만 해당 요소는 전체 콘텐츠 모델 또는 요소 트리의 필요한 위치에 배치된 경우에만 응용 프로그램이나 페이지에서 제대로 동작합니다. 예를 들어, MenuItem은 일반적으로 Menu와 같은 MenuBase 파생 클래스의 자식으로 배치해야 합니다. 특정 요소의 콘텐츠 모델은 컨트롤 및 XAML 요소로 사용할 수 있는 기타 WPF 클래스의 클래스 페이지에서 설명의 일부로 문서화됩니다.

개체 요소 속성

XAML의 속성은 다양한 구문을 사용하여 설정합니다. 특정 속성에 사용할 수 있는 구문은 설정하는 속성의 기본 형식 시스템 특성에 따라 다릅니다.

속성 값을 설정하여 기능 또는 특성을 런타임 개체 그래프에서와 동일하게 개체에 추가합니다. 개체 요소에서 만든 개체의 초기 상태는 기본 생성자 동작을 기반으로 합니다. 일반적으로 응용 프로그램에서는 특정 개체의 완전한 기본 인스턴스가 아닌 다른 것을 사용합니다.

특성 구문(속성)

특성 구문은 기존 개체 요소에 특성을 선언하여 속성 값을 설정하는 XAML 태그 구문입니다. 특성 이름은 관련 개체 요소를 지원하는 클래스 속성의 CLR 멤버 이름과 일치해야 합니다. 특성 이름 뒤에는 할당 연산자(=)가 나옵니다. 특성 값은 따옴표로 묶은 문자열이어야 합니다.

참고참고

특성 안에 리터럴 따옴표를 넣으려면 다른 따옴표를 사용하면 됩니다.예를 들어 큰따옴표 문자를 포함하는 문자열을 선언하는 수단으로 작은따옴표를 사용할 수 있습니다.작은따옴표를 사용하든 큰따옴표를 사용하든 간에 특성 값 문자열을 열고 닫기 위해서는 일치하는 쌍을 사용해야 합니다.또한 특정 XAML 구문에 따른 문자 제한 문제를 해결하기 위해 사용 가능한 이스케이프 시퀀스 또는 다른 방법도 있습니다.XML 문자 엔터티 및 XAML를 참조하십시오.

특성 구문을 통해 속성을 설정하려면 해당 속성이 public이거나 쓰기 가능해야 합니다. 지원 형식 시스템에서 속성 값은 값 형식이거나 관련 지원 형식에 액세스할 때 XAML 프로세서에서 인스턴스화 또는 참조할 수 있는 참조 형식이어야 합니다.

WPF XAML 이벤트의 경우 특성 이름으로 참조되는 이벤트는 public이어야 하고 public 대리자가 있어야 합니다.

속성 또는 이벤트는 포함 개체 요소가 인스턴스화하는 클래스 또는 구조의 멤버여야 합니다.

특성 값 처리

여는 따옴표와 닫는 따옴표 사이에 들어 있는 문자열 값은 XAML 프로세서에서 처리됩니다. 속성의 경우 기본 처리 동작은 기본 CLR 속성의 형식에 따라 결정됩니다.

특성 값은 이 처리 순서에 따라 다음 중 하나로 채워집니다.

  1. XAML 프로세서에서 중괄호 또는 MarkupExtension에서 파생되는 개체 요소를 발견할 경우 해당 값을 문자열로 처리하는 대신 참조된 태그 확장이 먼저 평가되고 태그 확장에서 반환된 개체가 해당 값으로 사용됩니다. 많은 경우에 태그 확장에서 반환된 개체는 기존 개체에 대한 참조 또는 런타임까지 평가를 지연하는 표현식이 되며, 새로 인스턴스화된 개체는 아닙니다.

  2. 특성이 사용된 TypeConverter로 속성이 선언되거나 특성이 사용된 TypeConverter로 해당 속성의 값 형식이 선언된 경우 특성의 문자열 값이 변환 입력으로 형식 변환기에 제출되며 변환기는 새 개체 인스턴스를 반환합니다.

  3. TypeConverter가 없는 경우에는 속성 형식으로 직접 변환하는 작업이 시도됩니다. 이 최종 수준에서는 XAML 언어 기본 형식 간에 파서 네이티브 값에서 직접 변환되거나 열거형의 명명된 상수의 이름을 확인합니다. 그런 다음 파서는 일치하는 값에 액세스합니다.

열거형 특성 값

XAML의 열거형은 XAML 파서에서 기본적으로 처리되며 열거형의 멤버는 열거형의 명명된 상수 중 하나에 대한 문자열 이름을 지정하여 지정되어야 합니다.

플래그를 사용하지 않는 열거형 값의 경우 기본 동작은 특성 값의 문자열을 처리하고 이를 열거형 값 중 하나로 해결하는 것입니다. 코드에서처럼 열거형을 Enumeration.Value 형식으로 지정하지 않습니다. 대신 Value만 지정하며, Enumeration은 설정 중인 속성의 형식에서 유추됩니다. 특성을 Enumeration.Value 형식으로 지정하면 특성이 올바르게 해결되지 않습니다.

플래그 열거형의 경우 동작은 Enum.Parse 메서드를 기반으로 이루어집니다. 각 값을 쉼표로 구분하여 여러 개의 값을 하나의 플래그 열거형에 지정할 수 있습니다. 하지만 플래그 열거형 값이 아닌 열거형 값은 조합할 수 없습니다. 예를 들어 플래그를 사용하지 않는 열거형의 여러 조건에 대해 동작하는 Trigger를 만들기 위해 쉼표 구문을 사용할 수는 없습니다.

<!--This will not compile, because Visibility is not a flagwise enumeration.-->
...
<Trigger Property="Visibility" Value="Collapsed,Hidden">
  <Setter ... />
</Trigger>
...

WPF에서는 XAML에서 설정할 수 있는 특성을 지원하는 플래그 열거형이 드물지만, 이러한 열거형 중 하나가 StyleSimulations입니다. 예를 들어 쉼표로 구분된 플래그 사용 특성 구문을 사용하여 Glyphs 클래스의 설명 부분에 나오는 예제를 수정할 수 있습니다. 즉, StyleSimulations = "BoldSimulation"은 StyleSimulations = "BoldSimulation,ItalicSimulation"이 될 수 있습니다. KeyBinding.Modifiers는 둘 이상의 열거형 값을 지정할 수 있는 또 다른 속성입니다. 하지만 이 속성은 ModifierKeys 열거형이 자체 형식 변환기를 지원하기 때문에 특별한 경우입니다. 한정자에 대한 형식 변환기에서는 구분 기호로 쉼표(,) 대신 더하기 기호(+)를 사용합니다. 이 변환에서는 Microsoft Windows 프로그래밍에서 키 조합을 나타내는 "Ctrl+Alt" 같은 보다 일반적인 구문을 지원합니다.

속성 및 이벤트 멤버 이름 참조

특성을 지정할 때는 포함 개체 요소에 대해 인스턴스화한 CLR 형식의 멤버인 속성이나 이벤트를 참조할 수 있습니다.

또는 포함 개체 요소와는 별개로 연결된 속성 또는 연결된 이벤트를 참조할 수 있습니다. 연결된 속성에 대해서는 이후 단원에서 설명합니다.

또한 부분적으로 정규화된 이름인 typeName.event를 사용하여 기본 네임스페이스를 통해 액세스 가능한 모든 개체의 모든 이벤트에 이름을 지정할 수도 있습니다. 이 구문은 라우트된 이벤트에 대해 처리기를 연결할 수 있도록 지원합니다. 여기서 처리기는 자식 요소에서 라우팅되었지만 부모 요소의 멤버 표에 없는 이벤트를 처리합니다. 이 구문은 연결된 이벤트 구문과 비슷하지만 여기서 이벤트는 실제 연결된 이벤트가 아니라, 정규화된 이름을 사용하여 이벤트를 참조하는 것입니다. 자세한 내용은 라우트된 이벤트 개요를 참조하십시오.

일부 경우에는 속성 이름이 특성 이름 대신 특성 값으로 제공되기도 합니다. 속성 이름에는 ownerType.dependencyPropertyName 형식으로 지정된 속성 같은 한정자가 포함될 수도 있습니다. 이는 스타일이나 템플릿을 XAML로 작성할 때 일반적으로 나타나는 경우입니다. 특성 값으로 제공되는 속성 이름에 대한 처리 규칙은 서로 다르며 설정되는 속성의 형식 또는 특정 WPF 하위 시스템의 동작에 의해 제어됩니다. 자세한 내용은 스타일 지정 및 템플릿을 참조하십시오.

속성 이름은 특성 값이 속성 간 관계를 설명할 때에도 사용됩니다. 이 기능은 데이터 바인딩 및 Storyboard 대상에 사용되며 PropertyPath 클래스 및 형식 변환기를 통해 활성화됩니다. 조회 의미 체계에 대한 자세한 설명은 PropertyPath XAML 구문을 참조하십시오.

속성 요소 구문

속성 요소 구문은 요소에 대한 기본 XML 구문 규칙과 다소 다른 구문입니다. XML에서 특성 값은 사실상 문자열과 같으며, 사용되는 문자열 인코딩 형식만 다를 수 있습니다. XAML에서는 다른 개체 요소를 속성의 값이 되도록 할당할 수 있습니다. 이 기능은 속성 요소 구문을 통해 활성화됩니다. 속성을 요소 태그 안에 특성으로 지정하는 대신 elementTypeName.propertyName 형식으로 여는 요소 태그를 사용하여 속성을 지정하고 속성의 값을 지정한 다음 속성 요소를 닫습니다.

다시 말해 구문은 왼쪽 꺾쇠괄호(<)로 시작하여 그 뒤에 속성 요소 구문이 포함된 클래스나 구조의 형식 이름이 바로 이어집니다. 그 뒤에는 하나의 점(.), 속성의 이름, 오른쪽 꺾쇠 괄호(>)가 차례로 이어집니다. 특성 구문과 마찬가지로 해당 속성은 지정된 형식의 선언된 public 멤버 내에 있어야 합니다. 속성에 할당할 값은 속성 요소 안에 포함됩니다. 개체를 값으로 지정하는 경우는 속성 요소 구문으로 충족해야 하는 상황이므로 일반적으로 값은 하나 이상의 개체 요소로 지정됩니다. 마지막으로, 동일한 elementTypeName.propertyName 조합을 지정하는 동등한 닫는 태그를 다른 요소 태그와 적절한 중첩을 이루어 균형되게 제공해야 합니다.

예를 들어 다음은 ButtonContextMenu 속성에 대한 속성 요소 구문입니다.

<Button>
  <Button.ContextMenu>
    <ContextMenu>
      <MenuItem Header="1">First item</MenuItem>
      <MenuItem Header="2">Second item</MenuItem>
    </ContextMenu>
  </Button.ContextMenu>
  Right-click me!</Button>

지정하는 속성 형식이 String과 같은 기본 값 형식이거나 이름이 지정된 열거형인 경우에는 속성 요소 내의 값을 내부 텍스트로 지정할 수도 있습니다. 이 두 가지 경우에는 더 간단한 특성 구문도 사용할 수 있기 때문에 이러한 방법이 많이 사용되지는 않습니다. 속성 요소를 문자열로 채우는 한 가지 시나리오는 XAML 콘텐츠 속성이 아니지만 UI 텍스트를 표현하는 데 사용되는 속성과 해당 UI 텍스트에 나타나야 하는 줄 바꿈과 같은 특정 공백 요소를 위한 경우입니다. 특성 구문에서는 줄 바꿈을 유지할 수 없지만 유효한 공백 보존이 활성화되어 있으면 적절한 요소 구문에서는 유지할 수 있습니다. 자세한 내용은 XAML의 공백 처리를 참조하십시오. 또 다른 시나리오는 x:Uid 지시문가 속성 요소에 적용되므로 포함된 값을 WPF 출력 BAML 또는 기타 방법에 의해 지역화되어야 하는 값으로 표시하도록 하는 경우입니다.

속성 요소는 WPF 논리 트리에 표시되지 않습니다. 속성 요소는 속성을 설정하기 위한 특정 구문일 뿐이며 이를 지원하는 인스턴스나 개체가 있는 요소가 아닙니다. 논리 트리 개념에 대한 자세한 내용은 WPF의 트리를 참조하십시오.

특성과 속성 요소 구문이 모두 지원되는 속성의 경우 두 구문의 결과는 일반적으로 동일하지만, 구문에 따라 공백 처리와 같은 세세한 부분은 조금 다를 수 있습니다.

컬렉션 구문

XAML 사양에서는 구현된 XAML 프로세서가 컬렉션 값 형식의 속성을 식별해야 합니다. .NET으로 구현된 일반적 WPF XAML 프로세서는 관리 코드와 CLR을 기반으로 하며 다음 중 하나를 통해 컬렉션 형식을 식별합니다.

속성의 형식이 컬렉션인 경우에는 유추된 컬렉션 형식을 개체 요소로 태그에 지정할 필요가 없습니다. 대신 컬렉션의 항목이 될 요소를 속성 요소의 하나 이상의 자식 요소로 지정합니다. 이러한 각 항목은 로드 도중 개체로 평가되며 암시적 컬렉션의 Add 메서드 호출을 통해 컬렉션에 추가됩니다. 예를 들어 StyleTriggers 속성은 IList를 구현하는 특수화된 컬렉션 형식 TriggerCollection을 사용합니다. 하지만 태그에서 TriggerCollection 개체 요소를 인스턴스화할 필요는 없습니다. 대신 하나 이상의 Trigger 항목을 Style.Triggers 속성 요소 내의 요소로 지정합니다. 여기서 Trigger(또는 파생된 클래스)는 강력한 형식의 암시적 TriggerCollection에 대한 요소 형식으로 예상되는 형식입니다.

<Style x:Key="SpecialButton" TargetType="{x:Type Button}">
  <Style.Triggers>
    <Trigger Property="Button.IsMouseOver" Value="true">
      <Setter Property = "Background" Value="Red"/>
    </Trigger>
    <Trigger Property="Button.IsPressed" Value="true">
      <Setter Property = "Foreground" Value="Green"/>
    </Trigger>
  </Style.Triggers>
</Style>

속성은 컬렉션 형식 및 해당 형식과 파생된 형식의 XAML 콘텐츠 속성일 수 있습니다. 이에 대해서는 이 항목의 다음 단원에서 설명합니다.

암시적 컬렉션 요소는 태그에 요소로 나타나지 않더라도 논리 트리 표현에 멤버를 만듭니다. 일반적으로 부모 형식의 생성자는 속성 중 하나인 컬렉션에 대해 인스턴스화를 수행하며 처음에는 비어 있는 컬렉션이 개체 트리의 일부가 됩니다.

참고참고

컬렉션 검색에는 제네릭 목록 및 사전 인터페이스(IList<T>IDictionary<TKey, TValue>)가 지원되지 않습니다.하지만 List<T> 클래스는 IList를 직접 구현하므로 이를 기본 클래스로 사용할 수 있습니다. 또는 Dictionary<TKey, TValue> 클래스는 IDictionary를 직접 구현하므로 이를 기본 클래스로 사용할 수도 있습니다.

컬렉션 형식의 .NET 참조 페이지에서 컬렉션에 대한 개체 요소가 의도적으로 생략된 이 구문은 XAML 구문 섹션에서 암시적인 컬렉션 구문으로 표시되기도 합니다.

루트 요소를 제외하고 다른 요소의 자식 요소로 중첩된 XAML 파일의 모든 개체 요소는 실제로는 다음 경우 중 하나 또는 둘 모두에 해당하는 요소입니다. 첫 번째 경우는 부모 요소의 암시적 컬렉션 속성의 멤버이고, 두 번째 경우는 부모 요소에 대한 XAML 콘텐츠 속성의 값을 지정하는 요소입니다. XAML 콘텐츠 속성에 대해서는 이후 단원에서 설명합니다. 다시 말해 태그 페이지에서 부모 요소와 자식 요소의 관계는 실제로 루트의 단일 개체이며, 루트 아래의 모든 개체 요소는 부모의 속성 값을 제공하는 단일 인스턴스이거나 부모의 컬렉션 형식 속성 값인 컬렉션 내의 항목 중 하나입니다. 이 단일 루트 개념은 XML에서 일반적일 뿐 아니라 Load 같은 XAML을 로드하는 API의 동작에서 자주 적용됩니다.

다음 예제는 명시적으로 지정된 컬렉션(GradientStopCollection)에 대한 개체 요소가 있는 구문입니다.

<LinearGradientBrush>
  <LinearGradientBrush.GradientStops>
    <GradientStopCollection>
      <GradientStop Offset="0.0" Color="Red" />
      <GradientStop Offset="1.0" Color="Blue" />
    </GradientStopCollection>
  </LinearGradientBrush.GradientStops>
</LinearGradientBrush>

컬렉션을 항상 명시적으로 선언할 수 있는 것은 아닙니다. 예를 들어 앞에 나온 Triggers 예제에서 TriggerCollection을 명시적으로 선언하려고 하면 실패합니다. 컬렉션을 명시적으로 선언하려면 컬렉션 클래스가 기본 생성자를 지원해야 하는데 TriggerCollection에는 기본 생성자가 없습니다.

XAML 콘텐츠 속성

XAML 콘텐츠 구문은 ContentPropertyAttribute를 클래스 선언의 일부로 지정하는 클래스에서만 사용할 수 있는 구문입니다. ContentPropertyAttribute는 해당 요소 형식(파생된 클래스 포함)의 콘텐츠 속성인 속성 이름을 참조합니다. XAML 프로세서에서 처리될 때 개체 요소의 여는 태그와 닫는 태그 사이에 있는 모든 자식 요소 또는 내부 텍스트는 해당 개체에 대한 XAML 콘텐츠 속성의 값으로 할당됩니다. 콘텐츠 속성의 명시적 속성 요소를 지정할 수 있지만 일반적으로 이러한 지정은 .NET 참조의 XAML 구문 섹션에 나와 있지 않습니다. 명시적/자세한 정보 표시 기술은 경우에 따라 태그 명확성 또는 태그 스타일로서 의미가 있지만 일반적으로 콘텐츠 속성의 용도는 부모-자식으로 직접 연결된 요소가 바로 중첩될 수 있도록 태그를 효율적으로 사용하기 위한 것입니다. 요소의 다른 속성에 대한 속성 요소 태그는 엄격한 XAML 언어 정의에 대한 "콘텐츠"로 할당되지 않습니다. 이러한 태그는 미리 XAML 파서의 처리 순서로 처리되고 "콘텐츠"로 간주되지 않습니다.

연속적이어야 하는 XAML 콘텐츠 속성 값

XAML 콘텐츠 속성의 값은 해당 개체 요소의 다른 모든 속성 요소의 맨 앞 또는 맨 뒤에 지정해야 합니다. 이는 XAML 콘텐츠 속성의 값이 문자열로 지정되든 하나 이상의 개체로 지정되든 간에 해당되는 사실입니다. 예를 들어, 다음 태그는 구문 분석되지 않습니다.

<Button>I am a 
  <Button.Background>Blue</Button.Background>
  blue button</Button>

이 구문이 콘텐츠 속성에 대한 속성 요소 구문을 사용하여 명시적 만들어진 구문이면 콘텐츠 속성이 두 번 설정되기 때문에 이 구문은 올바르지 않습니다.

<Button>
  <Button.Content>I am a </Button.Content>
  <Button.Background>Blue</Button.Background>
  <Button.Content> blue button</Button.Content>
</Button>

마찬가지로 콘텐츠 속성이 컬렉션일 때 자식 요소가 속성 요소와 함께 분산된 경우도 올바르지 않은 예입니다.

<StackPanel>
  <Button>This example</Button>
  <StackPanel.Resources>
    <SolidColorBrush x:Key="BlueBrush" Color="Blue"/>
  </StackPanel.Resources>
  <Button>... is illegal XAML</Button>
</StackPanel>

콘텐츠 속성 및 컬렉션 구문 조합

두 개 이상의 개체 요소를 콘텐츠로 사용하려면 콘텐츠 속성의 형식이 컬렉션 형식이어야 합니다. 컬렉션 형식의 속성 요소 구문처럼, XAML 프로세서는 컬렉션 형식인 형식을 식별해야 합니다. 요소에 XAML 콘텐츠 속성이 있고 XAML 콘텐츠 속성의 형식이 컬렉션이면 암시적 컬렉션 형식을 태그에서 개체 요소로 지정할 필요가 없으며 XAML 콘텐츠 속성을 속성 요소로 지정할 필요가 없습니다. 따라서 태그의 콘텐츠 모델에서 둘 이상의 자식 요소를 콘텐츠로 할당할 수 있습니다. 다음은 Panel 파생 클래스의 콘텐츠 구문입니다. 모든 Panel 파생 클래스는 XAML 콘텐츠 속성을 Children으로 설정하며, 이를 위해서는 UIElementCollection 형식의 값이 필요합니다.

<Page
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  >
  <StackPanel>
    <Button>Button 1</Button>
    <Button>Button 2</Button>
    <Button>Button 3</Button>
  </StackPanel>
</Page>

태그에는 Children의 속성 요소와 UIElementCollection의 요소가 필요하지 않습니다. 이는 XAML의 디자인 기능으로, 이를 통해 UI를 정의하는 재귀적으로 포함된 요소가 속성 요소 태그 또는 컬렉션 개체의 개입 없이도 인접 부모-자식 요소 관계가 포함된 중첩 요소의 트리로 더 직관적으로 표현될 수 있습니다. 사실 UIElementCollection은 태그에서 개체 요소로 명시적으로 지정할 수 없습니다. 암시적 컬렉션이 원래 용도이기 때문에 UIElementCollection은 public 기본 생성자를 노출하지 않으며 따라서 개체 요소로 인스턴스화할 수 없습니다.

콘텐츠 속성을 사용하여 개체에서 속성 요소 및 개체 요소 혼합

XAML 사양에서는 개체 요소 내에 XAML 콘텐츠 속성을 채우는 데 사용되는 개체 요소가 연속적이고 혼합되지 않도록 XAML 프로세서가 적용할 수 있음을 선언합니다. 속성 요소와 콘텐츠의 혼합에 대한 이러한 제한은 WPF XAML 프로세서에 의해 적용됩니다.

자식 개체 요소를 개체 요소 내의 첫 번째 태그로 사용할 수 있습니다. 그런 다음 속성 요소를 사용할 수 있습니다. 또한 하나 이상의 속성 요소를 지정한 다음 콘텐츠 및 추가적인 속성 요소를 차례로 지정할 수 있습니다. 하지만 콘텐츠 뒤에 요소를 지정하고 나면 더 이상 콘텐츠를 지정할 수 없으며 속성 요소만 추가할 수 있습니다.

이러한 콘텐츠/속성 요소 순서 요구 사항은 콘텐츠로 사용되는 내부 텍스트에는 적용되지 않습니다. 하지만 속성 요소의 여러 곳에 내부 텍스트가 있으면 태그에서 유효한 공백을 시각적으로 찾는 것이 어려우므로 내부 텍스트를 연속적으로 유지하는 것이 좋은 태그 스타일입니다.

XAML 네임스페이스

이전 구문 예제에서는 기본 XAML 네임스페이스 이외의 XAML 네임스페이스는 지정하지 않았습니다. 일반적으로 WPF 응용 프로그램에서 기본 XAML 네임스페이스는 WPF 네임스페이스로 지정됩니다. 기본 XAML 네임스페이스 외에 다른 XAML 네임스페이스를 지정할 수 있고 유사한 구문도 계속 사용할 수 있습니다. 그러나 이 경우에는 기본 XAML 네임스페이스 내에서 액세스할 수 없는 명명된 클래스가 있는 모든 곳에서 해당 클래스 이름 앞에는 해당하는 CLR 네임스페이스에 매핑되는 XAML 네임스페이스의 접두사가 있어야 합니다. 예를 들어 <custom:Example/>은 Example 클래스의 인스턴스를 인스턴스화하기 위한 개체 요소 구문으로, 해당 클래스가 포함된 CLR 네임스페이스(그리고 지원 형식이 포함된 외부 어셈블리 정보)가 이전에 custom 접두사로 매핑되었습니다.

XAML 네임스페이스에 대한 자세한 내용은 WPF XAML을 위한 XAML 네임스페이스 및 네임스페이스 매핑을 참조하십시오.

태그 확장

XAML에서는 문자열 특성 값 또는 개체 요소의 일반 XAML 프로세서 처리에서 벗어나고 처리를 지원 클래스로 지연시킬 수 있도록 하는 태그 확장 프로그래밍 엔터티를 정의합니다. 특성 구문을 사용할 때 태그 확장을 XAML 프로세서로 식별하는 문자는 여는 중괄호({) 뒤에 닫는 중괄호(}) 이외의 모든 문자를 사용하여 구성된 문자입니다. 여는 중괄호 뒤의 첫 번째 문자열은 특정 확장 동작을 제공하는 클래스를 참조해야 하며 하위 문자열이 실제 클래스 이름의 일부인 경우 참조에는 하위 문자열 "확장"을 생략할 수 있습니다. 그 뒤에는 하나의 공백을 지정할 수 있으며 그 뒤에 나오는 모든 문자는 닫는 중괄호가 나타나기 전까지 확장 구현에서 입력으로 사용됩니다.

.NET XAML 구현에서는 MarkupExtension 추상 클래스를 WPF 및 다른 프레임워크나 기술에서 지원하는 모든 태그 확장의 기반으로 사용합니다. WPF에서 구체적으로 구현하는 태그 확장의 주된 용도는 이미 존재하는 다른 개체를 참조하는 방법 또는 런타임에 평가될 개체에 대한 지연된 참조를 만드는 방법을 제공하는 것입니다. 예를 들어 특정 속성이 일반적으로 사용하는 값 대신 {Binding} 태그 확장을 지정하여 간단한 WPF 데이터 바인딩을 수행할 수 있습니다. WPF 태그 확장의 대부분은 일반적으로 특성 구문이 가능하지 않은 속성에 대해 특성 구문을 사용할 수 있게 해줍니다. 예를 들어, Style 개체는 중첩된 일련의 개체 및 속성을 포함하는 비교적 복잡한 형식입니다. WPF에서 스타일은 일반적으로 ResourceDictionary의 리소스로 작성되며, 자원을 요청하는 두 가지 WPF 태그 확장 중 하나를 통해 참조됩니다. 태그 확장은 속성 값의 평가를 리소스 조회까지 연기하며 다음 예제와 같은 특성 구문에서 Style 속성의 값을 제공하고 Style 형식을 사용할 수 있도록 합니다.

<Button Style="{StaticResource MyStyle}">My button</Button>

여기에서 StaticResource는 태그 확장 구현을 제공하는 StaticResourceExtension 클래스를 식별합니다. 다음 문자열 MyStyle은 기본값이 아닌 StaticResourceExtension 생성자의 입력으로 사용됩니다. 여기서 확장 문자열에서 가져온 매개 변수는 요청된 ResourceKey를 선언합니다. MyStyle은 리소스로 정의된 Stylex:Key 값으로 예상됩니다. StaticResource 태그 확장을 사용할 때는 로드 시 정적 리소스 조회 논리를 통해 Style 속성 값을 제공하기 위해 리소스를 사용해야 합니다.

태그 확장에 대한 자세한 내용은 태그 확장 및 WPF XAML을 참조하십시오. 일반적인 .NET XAML 구현에서 사용되는 태크 확장 및 다른 XAML 프로그래밍 기능에 대한 참조 자료는 XAML 네임스페이스(x:) 언어 기능을 참조하십시오. WPF 관련 태그 확장은 WPF XAML 확장을 참조하십시오.

연결된 속성

연결된 속성은 특정 형식이 속성을 소유하고 정의할 수 있지만 모든 요소에 대해 특성 또는 속성 요소로 속성을 설정할 수 있는 XAML에서 도입된 프로그래밍 개념입니다. 연결된 속성을 사용할 기본 시나리오는 태그 구조의 자식 요소가 모든 요소에서 광범위하게 공유된 개체 모델이 없더라도 정보를 상위 요소에 보고할 수 있도록 하는 경우입니다. 이와 반대로 상위 요소도 이 연결된 속성을 사용하여 자식 요소에 정보를 보고할 수 있습니다. 연결된 속성의 용도와 연결된 속성을 직접 만드는 방법에 대해서는 연결된 속성 개요를 참조하십시오.

연결된 속성은 typeName.propertyName 조합도 지정한다는 점에서 속성 요소 구문과 외관상 비슷한 구문을 사용합니다. 하지만 중요한 두 가지 차이점이 있습니다.

  • 특성 구문을 통해 연결된 속성을 설정할 때도 typeName.propertyName 조합을 사용할 수 있습니다. 연결된 속성은 특성 구문에서 정규화된 이름을 사용해야 한다는 요구 사항이 있는 유일한 경우입니다.

  • 연결된 속성에 대해 속성 요소 구문을 사용할 수도 있습니다. 하지만 일반적인 속성 요소 구문의 경우 사용자가 지정하는 typeName은 속성 요소가 포함된 개체 요소입니다. 연결된 속성을 참조하는 경우 typeName은 개체 요소가 포함된 것이 아니라 연결된 속성을 정의하는 클래스입니다.

연결된 이벤트

연결된 이벤트는 이벤트를 특정 형식으로 정의할 수 있지만 모든 개체 요소에 처리기를 연결할 수 있는 XAML에서 도입된 또 다른 프로그래밍 개념입니다. WOF 구현에서 연결된 이벤트를 정의하는 형식은 서비스를 정의하는 정적 형식인 경우가 많으며 경우에 따라서는 이러한 연결된 이벤트는 서비스를 노출하는 형식의 라우트된 이벤트 별칭으로 노출됩니다. 연결된 이벤트에 대한 처리기는 특성 구문을 통해 지정합니다. 연결된 이벤트와 마찬가지로 특성 구문은 typeName.eventName을 사용할 수 있도록 연결 이벤트에 대해 확장됩니다. 여기서 typeName은 연결된 이벤트 인프라에 Add 및 Remove 이벤트 처리기 접근자를 제공하는 클래스이며 eventName은 이벤트 이름입니다.

XAML 루트 요소 분석

다음 표에서는 일반적인 XAML 루트 요소를 상세히 표시하여 루트 요소의 특정 특성을 보여 줍니다.

<Page

루트 요소를 여는 개체 요소

xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"

기본(WPF) XAML 네임스페이스

xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"

XAML 언어 XAML 네임스페이스

x:Class="ExampleNamespace.ExampleCode"

partial 클래스에 정의된 모든 코드 숨김에 태그를 연결하는 partial 클래스 선언

>

루트 개체 요소의 끝. 요소에 자식 요소가 포함되어 있기 때문에 개체가 아직 닫혀 있지 않습니다.

선택적 및 권장하지 않는 XAML 사용법

다음 단원에서는 XAML 프로세서에서 기술적으로 지원되기는 하지만 XAML 소스를 포함하는 응용 프로그램을 개발할 때 너무 많은 정보를 출력하거나 미관상 문제를 유발하여 XAML 파일의 가독성을 저하시키는 XAML 사용법에 대해 설명합니다.

선택적 속성 요소 사용법

선택적 속성 요소 사용법에는 XAML 프로세서가 암시적으로 간주하는 요소 콘텐츠 속성을 구체적으로 지정하는 방법이 포함됩니다. 예를 들어 Menu의 콘텐츠를 선언할 때 Menu의 모든 자식 요소가 MenuItem이어야 하며 Items 컬렉션에 배치되어야 하는 암시적 XAML 프로세서 동작을 사용하는 대신, MenuItems 컬렉션을 <Menu.Items> 속성 요소 태그로 명시적으로 선언하고 각 MenuItem을 <Menu.Items> 안에 배치할 수 있습니다. 경우에 따라 선택적 사용법은 개체 구조를 태그에 표시되는 모양대로 시각적으로 명확하게 하는 데 도움이 될 수 있습니다. 또는 경우에 따라서는 명시적 속성 요소 사용법을 통해, 특성 값 안에 중첩된 태그 확장처럼 기술적으로는 작동하지만 시각적으로 혼동되는 태그를 피할 수 있습니다.

전체 typeName.memberName 정규화된 특성

특성의 typeName.memberName 형식은 실제로 라우팅된 이벤트의 경우보다 더 범용적으로 작동합니다. 그러나 형식이 불필요하며 이를 피해야 하는 다른 상황에서는 태그 스타일 및 가독성의 이유로만 사용됩니다. 다음 예제에서 Background 속성에 대한 세 참조는 완전히 동일합니다.

<Button Background="Blue">Background</Button>
<Button Button.Background="Blue">Button.Background</Button>
<Button Control.Background="Blue">Control.Background</Button>

Button.Background는 Button에서 해당 속성에 대한 정규화된 조회가 성공적이고(Background는 Control에서 상속되었음) Button이 개체 요소의 클래스 또는 기본 클래스이기 때문에 작동합니다. Control.Background는 Control 클래스가 실제로 Background를 정의하며 ControlButton 기본 클래스이기 때문에 작동합니다.

하지만 다음 typeName.memberName 형식 예제는 작동하지 않으며 따라서 주석으로 표시됩니다.

<!--<Button Label.Background="Blue">Does not work</Button> -->

LabelControl의 다른 파생 클래스이며 Label.Background를 Label 개체 요소 안에서 지정한 경우 이 사용법은 동작합니다. 하지만 LabelButton의 클래스 또는 기본 클래스가 아니기 때문에 지정된 XAML 프로세서 동작은 Label.Background를 연결된 속성으로 처리하는 것입니다. Label.Background는 사용 가능한 연결된 속성이 아니며 이 사용법은 실패합니다.

baseTypeName.memberName 속성 요소

baseTypeName.memberName 구문은 typeName.memberName 형식이 특성 구문에서 사용되는 것과 비슷한 방식으로 속성 요소 구문에 사용됩니다. 예를 들어 다음 구문은 작동합니다.

<Button>Control.Background PE
  <Control.Background>
    <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
      <GradientStop Color="Yellow" Offset="0.0" />
      <GradientStop Color="LimeGreen" Offset="1.0" />
    </LinearGradientBrush>
    </Control.Background>
</Button>

여기에서 속성 요소가 Button에 포함되었지만 속성 요소는 Control.Background으로 지정되었습니다.

하지만 특성에 대한 typeName.memberName 형식과 마찬가지로 baseTypeName.memberName은 적합하지 않은 태그 스타일이며 사용하지 않는 것이 좋습니다.

참고 항목

개념

XAML 개요(WPF)

종속성 속성 개요

TypeConverter 및 XAML

WPF에 대한 XAML 및 사용자 지정 클래스

기타 리소스

XAML 네임스페이스(x:) 언어 기능

WPF XAML 확장