Laboratory/Develop

XAML 구문 용어

theking 2008. 4. 22. 09:32
출처 : Microsoft.com
 
Windows Presentation Foundation
XAML 구문 용어

여기에서는 Extensible Application Markup Language (XAML) 구문의 요소를 설명하기 위해서 사용되는 용어를 정의합니다. 이러한 용어는 이 소프트웨어 개발 킷 (SDK)의 나머지 부분을 통해서 자주 사용됩니다. 이 글의 내용은 「XAML 소개」에서 소개한 기본적인 용어에 대한 상세한 설명입니다.

이 글에는 다음 내용이 포함되어 있습니다.

여기서 정의되는 XAML 구문 용어는 XAML 언어 중에서도 정의 또는 참조 됩니다. XAML는 XML에 근거하는 언어로 XML 의 구조 규칙을 따라고 있습니다. 여기서 소개하는 용어에는 XML 언어나 XML 문서 개체 모델 (DOM)의 설명에 자주 사용되는 용어와 공통의 용어나 그것들에 근거한 용어도 있습니다.

개체 요소 구문은 XML 요소를 선언해서 공용 언어 런타임 (CLR)의 클래스나 구조를 인스턴스화하는 XAML 마크 업 구문입니다. 이 구문은 HTML 등의 다른 마크업 언어의 요소 구문과 비슷합니다. 개체 요소 구문은 열기 꺾쇠 괄호 (<)로 시작되어, 인스턴스화 하는 클래스나 구조의 유형 이름이 이어집니다. 유형 이름의 후에는 0 개 이상의 공백을 포함할 수 있습니다. 또, 개체 요소로 0 개 이상의 특성을 선언할 수도 있습니다. 각 특성의 이름="값" 의 쌍은 하나 이상의 공백에서 구분합니다. 마지막에 다음 중 한쪽이 채워져 있어야 합니다.

  • 요소와 태그는 slash (/)와  계속되는 닫는 꺾쇠 괄호 (>)로 종료해야 합니다.

  • 시작 태그는 닫는 꺾쇠 괄호 (>)로 종료해야 합니다. 시작 태그의 뒤에는 다른 개체 요소, 속성 요소, 또는 내부텍스트를 포함할 수 있습니다. 실제로 여기에 포함할 수 있는 내용은 일반적으로 요소의 개체 모델에 의해 제한됩니다. 자세한 내용은 이 글의 「XAML 컨텐츠 구문」을 참조해 주세요. 그 외, 개체 요소의 대응하는 종료 태그가 다른 시작 태그/종료 태그 쌍과의 중첩 관계나 밸런스가 올바른 상태로 존재해야 합니다.

예를 들어, 다음의 예는Button클래스의 새로운 인스턴스를 작성하는 개체 요소 구문입니다.Name특성과 이 특성 값도 지정됩니다.

XAML
<ButtonName="CheckoutButton"/>

다음의 예의 개체 요소 구문에는 Extensible Application Markup Language (XAML) 컨텐츠 속성 구문도 포함되어 있습니다. 안에 포함되어 있는 내부텍스트는TextBox의 Extensible Application Markup Language (XAML) 컨텐츠 속성인Text를 설정하기 위해서 사용됩니다.

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

특성 구문은요소의 특성을 선언해서 속성 값의 설정이나 이벤트의 이벤트 처리기의 지정을 실시할 수 있는 XAML 마크 업 구문입니다. 요소는 항상 개체 요소 구문에 의해서 선언됩니다. 특성 이름은 속성 또는 이벤트의 CLR 멤버 이름과 일치해야 합니다. 특성 이름의 뒤에는 대입연산 자식 (=)이 계속 됩니다. 특성 값은 2 의 인용부호 (")로 둘러싸인 문자열이어야 합니다.

특성 구문에서 설정하는 속성은 공개 읽기 쓰기 가능한 속성이어야 합니다. 또, 속성 값은 XAML 프로세서에 의한 인스턴스화 또는 참조가 가능한 형식이어야 합니다. 이벤트의 경우는 퍼블릭 대리자(delegate)를 가지는 퍼블릭 이벤트이어야 합니다. 속성이나 이벤트는 보관 개체 요소에 의해서 인스턴스화 되는 클래스 또는 구조의 멤버여야 합니다.

특성 값은 다음의 몇가지 방법으로 다음 순서를 사용하여 설정됩니다.

  1. XAML 프로세서에서 중괄호 (MarkupExtension에서 파생 하는 개체 요소)가 검색 되었을 경우는 특성 값을 문자열로서 처리하는 대신에 참조되는 마크 업 확장기능이 먼저 평가되고, 그 마크 업 확장기능에 의해서 돌려주어진 개체가 사용됩니다. 마크 업 확장기능에 의해서 반환되는 개체는 많은 경우, 기존 개체에의 참조하거나 실행시되지 않으면 평가되지 않는 식으로 새로운 개체는 아닙니다.

  2. 속성 선언으로TypeConverter가 지정된 경우나 그 속성값 형식의 선언으로TypeConverter가 할당할 수 있는 경우는 특성 문자열값이 변환의 입력으로서 그 형식 컨버터에 보내지고, 컨버터에 의해서 새로운 개체 인스턴스가 반환됩니다.

  3. TypeConverter가 없는 경우는 속성 형식에의 직접 변환이 시행됩니다. 이 마지막의 수준은 원시 데이터 형간의 직접 변환인가 열거형 이름이 체크됩니다 (일치하는 값이 반환됩니다).

예를 들어, 전과 같은 마크 업을 사용한 다음의 예에서는Name속성에 문자열값을 할당하기 위해서 특성 구문이 사용됩니다.

XAML
<ButtonName="CheckoutButton"/>

Name속성은Button클래스의 멤버 테이블의 멤버입니다.ButtonName을 정의한FrameworkElement클래스의 파생 클래스입니다.

특성 값의 처리

시작과 마지막의 인용부호로 둘러싸인 문자열값은 XAML 프로세서에 의해서 처리됩니다. 속성에 대한 기본값의 처리 동작은 기본 CLR 속성 형식에 의해 정해집니다. 속성이 원시 데이터 형식의 경우는 문자열에서 적절한 원시 데이터 형식에의 암시 형식 변환에 근거하여 특성 값을 할당할 수 있습니다. 속성이 열거형의 경우는 그 열거형으로 정의된 이름으로서 문자열이 다루어져 열거 형식의 일치하는 값이 반환됩니다. 속성이 원시 데이터 형식에서도 열거형이 아닌 경우는 속성 자체 또는 변환처의 형식에서  선언되는 형식 컨버터에 의해서 특성 값이 처리되어야 합니다. 그 형식 컨버터가 제공하는 변환에서는 문자열을 받고, 기본 CLR 속성 형식의 인스턴스를 반환해야 합니다. 이 변환의 단계는 마크 업 확장기능에 의해서 연기할 수도 있습니다.

열거형의 특성 값

XAML 열거값은Enum구조의 네이티브 메서드에 의해 편입 처리됩니다.

플래그는 아닌 열거값에 대해는 특성 값의 문자열을 처리하고, 몇가지 열거값에 해결한다는 것이 네이티브인 동작입니다. 열거형을 지정하는 방법은 코드로 사용하는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>...

XAML에서 설정할 수 있는 특성을 지원하는 플래그 열거형은 WPF 에는 별로 없습니다. 그러나 그런 열거형의 일례가StyleSimulations입니다. 예를 들어, 쉼표 단락의 플래그 특성의 구문을 사용하여,Glyphs클래스의 「해설」에서 보여준 예를 수정도 가능합니다. 그 경우,StyleSimulations = "BoldSimulation"StyleSimulations = "BoldSimulation,ItalicSimulation"  과 같이 됩니다. 또,KeyBinding..::.Modifiers도 복수의 열거값을 지정할 수 있는 속성입니다. 다만, 이 속성은 특수한 경우입니다.ModifierKeys열거형은 독자적인 형식 컨버터를 지원하기 때문입니다. 변환 키를 위한 형식 컨버터에서는 쉼표(,) 대신 정부호 (+)를 단락 기호로서 사용합니다. 이 때문에 키의 조합을 나타낼 때 습관적으로 이용되는 구문 ("Ctrl+Alt" 등)이 마크 업에서 지원됩니다.

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

특성을 지정할 경우에는 보관 개체 요소를 위해 인스턴스화 한 CLR 형의 멤버 테이블내에 존재하는 임의의 속성이나 이벤트를 참조할 수 있습니다.

또, 보관 개체 요소와는 관계없이 첨부 속성이나 첨부 이벤트를 참조할 수도 있습니다.

그 외,typename.event부분 수식명을 사용하고, 기본값의 네임 스페이스에서 액세스 할 수 있는 임의의 개체의 임의의 이벤트를 지정할 수도 있습니다. 이 구문에서는 라우팅된 이벤트 처리기를 첨부할 수 있습니다. 이것에 의해, 자식 요소에서 라우팅된 이벤트가 새로운 요소의 멤버 테이블에도 없었던 경우에 그 이벤트를 처리할 수 있습니다. 이 구문은 첨부 이벤트의 구문과 비슷하지만, 이 경우의 이벤트는 진짜 첨부 이벤트가 아닙니다. 이 경우는 이벤트를 수식명으로 참조합니다. 자세한 내용은 「라우팅된 이벤트의 소개」를 참조해 주세요.

특성 이름이 아닌 특성 값에서 속성 이름이 지정되는 경우도 있습니다. 그 속성 이름에 수식자를 포함할 수도 있습니다 (ownerType.dependencyPropertyName의 형식에서 지정되는 속성 등).이것은 XAML에서 스타일이나 템플릿을 작성할 때의 일반적인 시나리오입니다. 특성 값으로 지정한 속성 이름에는 또 다른 처리 규칙이 적용되어 설정하는 속성 형식이나 문맥의 요인 (스타일이나 템플릿에 대상의 형식이 있을지 등)에 의해서 제어됩니다. 자세한 내용은 「스타일과 템플릿」을 참조해 주세요.

그 외, 속성 이름은 특성 값으로 속성 사이의 관계를 기술하는 경우에도 사용됩니다. 이 기능은 데이터 바인딩이나 스토리 보드 대상을 위해서 사용하여 PropertyPath클래스와 그 형식 컨버터에 의해서 구현됩니다. 검색 의미 체계(Semantics)의 자세한 내용은 「PropertyPath 의 XAML 구문」을 참조해 주세요.

속성 요소 구문은 기본적인 XML 구문에서 약간 일탈한 구문입니다. XML에서는 특성 값은 사실상의 문자열에서 변경할 수 있는 것은 사용하는 문자열 인코딩의 형식 (UTF-8 이외 목의 형식을 사용할까) 뿐입니다. XAML에서는 다른 개체 요소를 속성 값으로 할당할 수 있습니다. 이것을 구현 하는 것이 속성 요소 구문입니다. 속성을 요소 태그내의 특성으로서 지정하는 대신에elementTypeName.propertyName라는 형식의 시작 요소 태그를 사용하여 지정합니다. 다음은 속성 값을 지정하고, 마지막에 속성 요소를 닫습니다.

구체적으로 말하면, 이 구문은 열기 꺾쇠 괄호 (<)로 시작되어, 속성 요소 구문을 포함한 클래스 또는 구조의 유형 이름이 그 후에 잇습니다. 그리고 한개의 점 (.), 속성 이름 (지정한 형식의 멤버 테이블내에 존재할 필요가 있습니다), 닫는 꺾쇠 괄호 (>)가 계속 됩니다. 속성에 할당할 수 있는 값은 속성 요소내에 보관됩니다. 속성 요소 구문은 개체를 값으로 지정하는 시나리오로 사용하는 것이므로 이 값은 일반적으로 1 이상의 개체 요소로서 지정됩니다. 마지막으로 같은elementTypeName.propertyName  조합에 대응하는 종료 태그를 다른 요소 태그와의 중첩의 관계나 밸런스가 올바른 상태로 지정해야 합니다. 예를 들어, 다음의 예는ButtonContextMenu속성의 속성 요소 구문입니다.

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

값을 내부텍스트로 지정할 수도 있습니다. 다만, 그 경우는 지원된 속성 형식이 원시 데이터 형식 (String등) 이름이 지정된 열거형이어야 합니다. 이 두가지 사용 방법은 특성 구문에서도 지원되기 때문에 일반적이지는 않습니다. 속성 요소에 문자열을 설정하는 시나리오로서는 XAML 컨텐츠 속성 이외의 속성을 UI 텍스트의 표시를 위해서 사용하는 경우에 그 UI 텍스트내에 줄 바꿈등이 특수한 공백 요소가 포함되는 경우 등이 있습니다. 특성 구문에서는 줄 바꿈은 보관 유지할 수 없지만, 속성 요소 구문에서는 보관 유지할 수 있습니다. 다만, 중요한 공백 보관 유지가 활성화되어 있어야 합니다.(자세한 내용은 「XAML에서의 공백의 처리」를 참조해 주세요).

속성 요소는 논리 트리의 일부에서는 없습니다. 속성을 설정하기 위한 단순한 구문에서 대응하는 인스턴스를 가지는 요소가 아닙니다.

컬렉션 형식의 속성 요소 구문

XAML 사양에서는 값 형태가 컬렉션의 속성을 XAML 프로세서의 구현에서 식별할 수 있어야 합니다. WPF 구현은 매니지드 코드에 근거하기 때문에 XAML 프로세서는 다음 몇가지 방법으로 컬렉션 형식을 식별합니다.

속성 형식이 컬렉션의 경우, 추정의 컬렉션 형식을 마크 업에서 지정할 필요는 없습니다. 대신에 컬렉션 내의 항목이 되는 요소를 컬렉션 형식 속성 요소의 1 개 이상의 자식 요소로서 지정합니다. 그러한 각 항목이 로드 때에 개체로 평가되어 암시적인 컬렉션의Add메서드의 호출에 의해서 컬렉션에 추가됩니다. 예를 들어,StyleTriggers속성은 특화된 컬렉션 형식인TriggerCollection을 받습니다. 그러나TriggerCollection을 마크 업에서 인스턴스화 할 필요는 없습니다. 대신에 하나이상의Trigger항목을Style.Triggers속성 요소내의 요소로서 지정합니다.Trigger(또는 파생 클래스)는 엄밀하게 형식 지정된 암시적인TriggerCollection항목의 형식으로서 가정되는 형식입니다.

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

컬렉션 형식의 속성이 그 형식과 파생 형식의 XAML 컨텐츠 속성이기도 한 경우도 있습니다.

암시적인 컬렉션 요소는 마크 업에는 요소로서 포함되지 않지만, 논리 트리의 멤버는 작성됩니다. 일반적으로는 소유하는 형식의 생성자에 의해 그 속성의 하나인 컬렉션이 인스턴스화 되고, 트리에 컬렉션이 추가됩니다.

사용자 삽입 이미지
메모 :

제네릭 목록 인터페이스 및 제네릭 사전 인터페이스 (IList<(Of<(T>)>)IDictionary<(Of<(TKey, TValue>)>))는 WPF XAML 프로세서에 의한 컬렉션 검색에서는 지원되고 있지 않습니다. 한편,List<(Of<(T>)>)클래스 및Dictionary<(Of<(TKey, TValue>)>)클래스를 기본클래스로서 사용할 수 있습니다. 각각,IListIDictionary를 직접 구현되기 때문입니다.

XAML 컨텐츠 구문은 클래스 선언의 일부로서ContentPropertyAttribute가 지원된 클래스에서만 유효한 구문입니다.ContentPropertyAttribute는 그 형식의 요소 (파생 클래스 포함)의 컨텐츠 속성으로서 정의된 속성을 이름으로 지정하는 매개 변수를 필요로 합니다. 이와 같이 해 지정된 속성이 요소의 XAML 컨텐츠 속성이 됩니다. XAML 프로세서에 의한 처리 시에는 요소의 시작 태그와 종료 태그의 사이에 검색 된 모든 자식 요소나 내부텍스트가 XAML 컨텐츠 속성 값으로 할당할 수 있습니다. 요소의 속성 요소 태그는 이러한 형태로 할당할 수 없습니다. 속성 요소 태그는 먼저 처리되고 "컨텐츠"로는 보여지지 않습니다.

다른 속성 와 같이 개체의 XAML 컨텐츠 속성은 특정 형식을 가집니다. 그 형식을Object형식에서  할 수도 있습니다. 컨텐츠 속성 형식은 개체의 컨텐츠 모델을 정의하는데 도움이 됩니다. 예를 들어,Object형식은 임의의 개체가 컨텐츠가 될 가능성이 있다는 의미로 엄밀하지는 않지만, 이와 같이 엄밀하지 않은 형식 지정의 경우에서도 컨텐츠는 단일 개체로 한정됩니다. 그 단일의 개체가 컬렉션 개체일 가능성도 있지만, 그 경우도 컨텐츠에 할당할 수 있는 컬렉션 개체는 하나뿐입니다.

특정 형식의 컨텐츠 모델은 그 형식의 클래스 페이지를 참조해 주세요. 형식 그룹 개념에 대해 토픽이 개별적으로 있는 경우도 있습니다. 그 경우는 관련 참조  링크가 포함되어 있습니다.

컬렉션 형식의 컨텐츠 구문

복수의 개체 요소 (또는 내부텍스트)를 컨텐츠로서 받아 들이기 위해서는 컨텐츠 속성 형식은 컬렉션 형식인 것이 필요합니다. 컬렉션 형식의 속성 요소 구문의 경우와 같이 XAML 프로세서에 의해서 컬렉션 형식의 형식이 식별되어야 합니다. 요소에 XAML 컨텐츠 속성이 있어, 그 XAML 컨텐츠 속성 형식이 컬렉션의 경우, 암시적인 컬렉션 형식은 마크 업에서 개체 요소로서 지정되어 있을 필요는 없고, XAML 컨텐츠 속성도 속성 요소로서 지정되어 있어야 합니다. 이 때문에 마크 업의 외관상의 컨텐츠 모델에서는 복수의 자식 요소를 컨텐츠로서 할당할 수 있습니다. 다음은Panel서브 클래스의 컨텐츠 구문입니다. 모든Panel파생 클래스에서는 XAML 컨텐츠 속성이Children에서 설정됩니다.ChildrenUIElementCollection형식 값이 필요합니다.

XAML
<Pagexmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  xmlns:x="http://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은 암시적인 컬렉션으로서만 사용되는 것이기 위해, 기본값의 퍼블릭 생성자는 공개되지 않습니다. 따라서 개체 요소로서 인스턴스화 할 수 없습니다.

컨텐츠 속성을 가지는 개체로의 속성 요소와 개체 요소의 혼합

XAML 사양에서는 개체 요소내의 XAML 컨텐츠 속성을 설정하기 위해 사용되는 개체 요소가 혼합하지 않고 연속하도록  XAML 프로세서에서 강제할 수 있습니다. WPF XAML 프로세서에서는 이 속성 요소와 컨텐츠 혼합에 대한 제한이 적용됩니다.

자식 개체 요소를 개체 요소내의 최초 직접적인 마크 업으로 하고, 그 후에 속성 요소를 도입할 수 있습니다. 또, 하나 이상의 속성 요소를 지정하여, 컨텐츠를 지정한 후에 또 속성 요소를 지정할 수도 있습니다. 다만, 일단 컨텐츠 뒤에 속성 요소를 지정하면, 그 후에 컨텐츠를 도입할 수 없습니다. 그 후에 추가할 수 있는 것은 속성 요소 뿐입니다.

이 컨텐츠와 속성 요소의 순서의 요건은 컨텐츠로서 사용되는 내부텍스트에는 적용되지 않습니다. 다만, 마크 업 스타일의 관점에서는 내부텍스트를 연속 한 상태에 유지하는 것을 추천합니다. 내부텍스트에 속성 요소가 혼재하면, 마크 업내의 중요한 공백을 이해하기 어려워집니다.

첨부 속성은 XAML에서 도입된 프로그래밍개념입니다. 첨부 속성을 사용하면, 특정 형식에서  소유 및 정의된 속성을 임의의 요소로 설정 할 수 있습니다. 첨부 속성은 주로 요소 트리내의 자식 요소가 모든 요소의 사이에 광범위하게 공유되는 개체 모델을 사용하지 않아도 새로운 요소에 정보를 보고할 수 있도록 하는 것을 목적으로 합니다. 반대로 새로운 요소가 자식 요소에 정보를 보고하기 위해 첨부 속성을 사용할 수도 있습니다. 첨부 속성의 목적과 독자적인 첨부 속성의 작성 방법의 자세한 내용은「첨부 속성 소개」를 참조해 주세요.

첨부 속성의 구문은typeName.propertyName의 조합을 지정하는 점에서 속성 요소 구문과 비슷하지만, 두가지 중요한 차이가 있습니다.

  • 특성 구문에서 첨부 속성을 설정 할 경우에도typeName.propertyName의 조합을 사용할 수 있습니다. 특성 구문에서 속성 이름을 수식 해야 하는 첨부 속성의 경우 뿐입니다.

  • 첨부 속성에 대해서 속성 요소 구문을 사용할 수도 있습니다. 다만, 일반적인 속성 요소 구문에서 지정한typeName은 속성 요소를 포함한 개체 요소이지만, 첨부 속성을 참조하는 경우는typeName은 첨부 속성을 포함한 개체 요소 대신, 첨부 속성을 정의하는 클래스입니다.

첨부 이벤트도 XAML에서 도입된 프로그래밍개념입니다. 첨부 이벤트에서는 이벤트를 특정 형식에서  정의하고, 처리기를 임의의 개체에 첨부할 수 있습니다. 첨부 이벤트를 정의하는 형식은 많은 경우, 서비스를 정의하는 정적인 형식입니다. 그러한 첨부 이벤트가 서비스를 공개하는 형식에서  라우팅된 이벤트 앨리어스(alias)에 의해서 공개되는 경우도 있습니다. 첨부 이벤트 처리기는 특성 구문에서 지정합니다. 첨부 속성의 경우와 같이 첨부 이벤트에서는 특성 구문이 확장되고,typename.eventname라는 사용 방법이 허가됩니다.typename은 첨부 이벤트 인프라의 Add 및 Remove 이벤트 처리기 접근자를 제공하는 클래스입니다.eventname은 이벤트 이름입니다.

지금까지 본 구문의 예에서는 기본값의 네임 스페이스 이외의 네임 스페이스는 지정되어 있지 않습니다. 일반적인 WPF 응용 프로그램에서는 기본값의 네임 스페이스는 WPF 네임 스페이스로 지정됩니다. 기본값의 네임 스페이스 이외의 네임 스페이스를 지정할 수도 있습니다. 그 경우도 기본적으로 같은 종류의 구문을 사용할 수 있습니다. 다만, 기본값의 네임 스페이스에서는 액세스 할 수 없는 클래스를 지정할 때 클래스 이름의 전에 대응하는 CLR 네임 스페이스를 매핑 하기 위해서 사용된 XML 네임 스페이스의 접두사를 붙이어야 합니다. 예를 들어,<custom:MyElement/>MyElement클래스의 인스턴스를 작성하기 위한 개체 요소 구문이지만, 이 클래스를 포함한 CLR 네임 스페이스 ( 및 그 네임 스페이스를 포함한 외부 어셈블리)는 이전에 custom prefix에 매핑됩니다.

XML 네임 스페이스와 XAML의 자세한 내용은 「XAML 네임 스페이스 및 네임 스페이스 할당」을 참조해 주세요.

XAML에서는 마크 업 확장기능프로그래밍 엔터티가 정의 됩니다. 마크 업 확장기능을 사용하면, XAML 프로세서에 의한 표준의 처리를 피하고, 대응하는 클래스에 특성이나 개체 요소의 처리를 맡길 수 있습니다. XAML 프로세서의 WPF 구현에서는 모든 마크 업 확장기능의 기초로서MarkupExtension추상 클래스가 사용 됩니다. 마크 업 확장기능은 특성 구문에서 닫는 중괄호 (}) 이외의 문자가 뒤에 계속 되는 여는 중괄호 ({)에 의해서 XAML 프로세서에 식별됩니다. 시작해 중괄호에 계속 되는 최초의 문자열은 특정의 확장 동작을 제공하는 클래스를 참조해야 합니다.그 참조에서는 부분 문자열 "Extension" 가 실제의 클래스 이름의 일부가 되어 있는 경우에는 그 부분 문자열을 생략 할 수 있습니다. 그 후, 사이에 1 개의 공백을 두고, 확장기능의 구현에서 입력으로서 사용되는 문자를 포함할 수 있습니다. 일련의 문자의 마지막에 닫는 중괄호를 지정합니다. WPF 의 마크 업 확장기능의 주요 목적은 특성 구문을 사용할 때에 다른 기존의 개체를 참조하는 수단을 제공하여,  실행시에 평가되는 개체의 지연 참조를 구현합니다. 예를 들어, 특정의 속성이 일반적으로 받는 값 형태 대신에 {Binding} 마크 업 확장기능을 지정해서 단순한 데이터 바인딩을 구현 할 수 있습니다. 많은 마크 업 확장기능은 일반적으로라면 특성 구문을 이용할 수 없는 속성으로 특성 구문을 이용할 수 있도록 합니다. 예를 들어,Style개체는 각각이 원시 데이터 형식 대신 byref 개체를 받는 다른 복수의 속성을 포함한 비교적 복잡한 참조형입니다. 다만, 스타일은 일반적으로 리소스로서 작성되어 리소스를 요청 하는 두가지의 마크 업 확장기능의 한쪽을 통해서 참조됩니다. 이 확장기능은 속성 값의 평가를 리소스 룩업까지 늦춥니다. 이것에 의해,Style형식을 받는Style속성 값을 다음과 같이 특성 구문에서 지정할 수 있게 됩니다.

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

여기서StaticResource는 마크 업 확장기능의 구현을 제공한StaticResourceExtension클래스를 식별합니다. 다음의 문자열MyStyle은 기본값은 아닌StaticResourceExtension생성자의 입력으로서 사용됩니다. 확장기능의 문자열에서 받는 이 매개 변수는 요청된ResourceKey를 선언합니다.MyStyle은 리소스로서 정의된Stylex:Key 특성값으로 가정됩니다.StaticResource 의 마크 업 확장기능의 사용 방법에서는 로드 때의 정적 리소스 룩업의 논리에 의해Style속성 값을 지정하려면 리소스를 사용해야 합니다.

마크 업 확장기능의 자세한 내용은 「마크 업 확장기능과 XAML」을 참조해 주세요. 마크 업 확장기능 및 그 외의 XAML 프로그래밍 기능의 참조 정보는 「XAML 네임 스페이스 (x:) 언어기능」 및 「WPF 네임 스페이스의 XAML 확장기능」을 참조해 주세요.

옵션의 속성 요소 사용 방법

옵션의 속성 요소 사용 방법으로서 XAML 프로세서에서 암시 목표라고 보여지는 요소의 컨텐츠 속성을 명시적으로 지정할 수 있습니다. 예를 들어,Menu의 컨텐츠를 선언할 경우에 XAML 프로세서의 암시적인 동작 (Menu의 모든 자식 요소는MenuItem으로Items컬렉션에 배포)를 이용하는 대신에MenuItems컬렉션을<Menu.Items>속성 요소 태그로서 명시적으로 선언하고, 각MenuItem을 <Menu.Items>안에 배포할 수 있습니다. 이 사용 방법에 의해서 마크 업에서 표현되는 개체 구조가 외형에서 알기 쉬운 경우가 있습니다. 또, 기술적으로는 가능해도 외형에서는 이해하기 어려운 마크 업 (특성값의 중첩된 마크 업 확장기능 등)을 피할 수 있는 경우도 있습니다.

typeName.memberName 로 완전하게 수식된 특성

typeName.memberName라는 특성의 형식은 실제로는 라우팅된 이벤트의 경우 뿐만이 아니라, 보다 일반적으로 사용할 수 있습니다. 다만, 다른 용도에서는 이 형식을 사용할 필요는 없습니다. 마크 업 스타일이나 가독성을 위해서만은 사용하지 마세요. 다음의 예에 보이는Background특성의 세가지는 참조는 완전하게 동등합니다.

XAML
<ButtonBackground="Blue">Background</Button><ButtonButton.Background="Blue">Button.Background</Button><ButtonControl.Background="Blue">Control.Background</Button>

Button.Background가 유효한 것은 이 속성의 수식된 룩업이Button이 성공하여 (Background는 Control에서 상속 됩니다),Button은 개체 요소의 클래스 (기본클래스)이기 때문입니다.Control.Background가 유효한 것은Background는 실제로Control클래스로 정의되어있고,ControlButton의 기본클래스이기 때문입니다.

다만, 다음 예의typeName.memberName형식은 유효하지는 않습니다. 이 예에는 그것을 보여주는 주석이 포함되어 있습니다.

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

LabelControl의 파생 클래스입니다.Label.Background를 Label개체 요소내에서 지정했을 경우는 유효하게 됩니다. 그러나LabelButton의 클래스에서도 기본클래스도 아니기 때문에 XAML 프로세서의 규정 동작에 의해,Label.Background는 첨부 속성으로서 처리됩니다.Label.Background는첨부 속성은 아니기 때문에 이 사용 방법은 실패합니다.

baseTypeName.memberName 속성 요소

특성 구문에서typename.membername형식을 사용할 수 있는 것과 같은 형태로 속성 요소 구문에서basetypename.membername구문을 사용할 수 있습니다. 예를 들어, 다음의 구문을 사용할 수 있습니다.

XAML
<Button>Control.Background PE<Control.Background><LinearGradientBrushStartPoint="0,0" EndPoint="1,1"><GradientStopColor="Yellow" Offset="0.0"/><GradientStopColor="LimeGreen" Offset="1.0"/></LinearGradientBrush></Control.Background></Button>

여기에서는 속성 요소가Button에 포함되어 있지만,  Control.Background로서 지정됩니다.

다만, 특성의typeName.memberName형식과 같이baseTypeName.memberName은  마크 업 스타일로서 적절하지는 않습니다.