XAML 구문 용어
업데이트: 2007년 11월
이 항목에서는 XAML(Extensible Application Markup Language) 구문의 요소를 설명하는 데 사용되는 용어를 설명합니다. 이들 용어는 이 SDK(소프트웨어 개발 키트)의 나머지 부분에서 자주 사용됩니다. 이 항목에서는 XAML 개요에서 소개한 기본 용어를 바탕으로 설명합니다.
이 항목에는 다음 단원이 포함되어 있습니다.
- XAML 구문 용어의 기원
- 개체 요소 구문
- 특성 구문
- 속성 요소 구문
- XAML 콘텐츠 구문
- 연결된 속성
- 연결된 이벤트
- Xml 네임스페이스
- 태그 확장
- 선택적 및 권장하지 않는 XAML 사용법
- 관련 항목
XAML 구문 용어의 기원
여기에서 정의하는 XAML 구문 용어는 XAML 언어 사양 내에서도 정의 또는 참조됩니다. XAML은 XML을 기반으로 하는 언어로 XML 구조 규칙을 따릅니다. 용어 중 일부는 XML 언어 또는 XML DOM(문서 개체 모델)을 설명할 때 일반적으로 사용되는 용어를 공유하거나 기반으로 합니다.
개체 요소 구문
개체 요소 구문은 XML 요소를 선언하여 CLR(공용 언어 런타임) 클래스 또는 구조를 인스턴스화하는 XAML 태그 구문입니다. 이 구문은 HTML과 같은 다른 태그 언어의 요소 구문과 비슷합니다. 개체 요소 구문은 왼쪽 꺾쇠괄호(<)로 시작되며 인스턴스화되는 클래스나 구조의 형식 이름이 그 뒤에 나옵니다. 형식 이름 뒤에는 공백이 없거나 1개 이상의 공백이 올 수 있고, 개체 요소에 대해서도 특성을 선언하지 않거나 1개 이상의 특성을 선언할 수 있습니다. 이때 각 특성 이름="값" 쌍은 하나 이상의 공백으로 구분합니다. 마지막으로 다음 중 하나가 적용되어야 합니다.
요소 및 태그를 닫을 때는 플래시(/) 다음에 바로 이어 오른쪽 꺾쇠괄호(>)를 붙여야 합니다.
여는 태그는 오른쪽 꺾쇠괄호(>)로 끝나야 합니다. 여는 태그 뒤에는 다른 개체 요소, 속성 요소 또는 내부 텍스트가 올 수 있습니다. 여기에 포함될 수 있는 항목은 일반적으로 요소의 개체 모델에 따라 달라집니다. 자세한 내용은 이 항목의 "콘텐츠 구문" 단원을 참조하십시오. 개체 요소에는 동등한 닫는 태그도 있어야 하며, 이때 닫는 태그는 다른 여는 태그/닫는 태그 쌍과 적절한 중첩을 이루고 균형이 맞아야 합니다.
예를 들어 다음 예제는 Button 클래스의 새 인스턴스를 인스턴스화하면서 동시에 Name 특성과 이 특성의 값을 지정하는 개체 요소 구문입니다.
<Button Name="CheckoutButton"/>
다음 예제는 XAML(Extensible Application Markup Language) 콘텐츠 속성 구문도 포함된 개체 요소 구문입니다. 안에 포함된 내부 텍스트는 TextBox XAML(Extensible Application Markup Language) 콘텐츠 속성 Text를 설정하는 데 사용됩니다.
<TextBox>This is a Text Box</TextBox>
특성 구문
특성 구문은 요소에 특성을 선언하여 속성 값을 설정하거나 이벤트의 이벤트 처리기 이름을 지정하는 XAML 태그 구문입니다. 요소는 항상 개체 요소 구문을 통해 선언됩니다. 특성 이름은 속성 또는 이벤트의 CLR 멤버 이름과 일치해야 합니다. 특성 이름 뒤에는 할당 연산자(=)가 나옵니다. 특성 값은 두 개의 따옴표(")로 묶은 문자열이어야 합니다.
속성이 특성 구문을 통해 설정되려면 public이어야 하고 읽기-쓰기 속성이어야 하며 XAML 프로세서가 인스턴스화하거나 참조할 수 있는 속성 값 형식이 있어야 합니다. 이벤트의 경우 이벤트는 public이어야 하며 public 대리자가 있어야 합니다. 속성 또는 이벤트는 포함 개체 요소가 인스턴스화하는 클래스 또는 구조의 멤버여야 합니다.
특성 값은 이 처리 순서에 따라 다음 중 하나로 채워집니다.
XAML 프로세서에서 중괄호 또는 MarkupExtension에서 파생되는 개체 요소를 발견할 경우 참조된 태그 확장은 문자열로 처리되는 것이 아니라 먼저 평가를 거치고 태그 확장에서 반환된 개체가 사용됩니다. 많은 경우에 태그 확장에서 반환하는 개체는 기존 개체에 대한 참조 또는 런타임까지 평가를 지연하는 표현식이 되며, 새 개체는 아닙니다.
지정된 TypeConverter로 속성이 선언되거나 특성이 사용된 TypeConverter로 해당 속성의 값 형식이 선언된 경우 특성의 문자열 값이 변환 입력으로 형식 변환기에 제출되며 변환기는 새 개체 인스턴스를 반환합니다.
TypeConverter가 없는 경우에는 속성 형식으로 직접 변환하는 작업이 시도됩니다. 이 최종 단계는 기본 형식을 직접 변환하는 것이거나 열거형에서 이름을 검사하고 결과적으로 일치하는 값을 반환하는 것입니다.
예를 들어 앞의 예제와 동일한 태그를 사용하는 경우 다음은 Name 속성에 문자열 값을 할당하는 데 사용되는 특성 구문 예제입니다.
<Button Name="CheckoutButton"/>
Name 속성은 Button 클래스 멤버 표의 멤버입니다. Button은 Name을 정의하는 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>
...
WPF에서는 XAML에서 설정할 수 있는 특성을 지원하는 플래그 열거형이 드물지만, 이러한 열거형 중 하나가 StyleSimulations입니다. 예를 들어 쉼표로 구분된 플래그 사용 특성 구문을 사용하여 Glyphs 클래스의 설명 부분에 나오는 예제를 수정할 수 있습니다. 즉, StyleSimulations = "BoldSimulation"을 StyleSimulations = "BoldSimulation,ItalicSimulation"으로 수정할 수 있습니다. KeyBinding.Modifiers도 둘 이상의 열거형 값을 지정할 수 있는 속성입니다. 하지만 이 속성은 ModifierKeys 열거형이 자체 형식 변환기를 지원하기 때문에 특별한 경우입니다. 한정자의 형식 변환기에서는 쉼표(,)가 아닌 더하기 기호(+)가 구분 기호로 사용되므로 "Ctrl+Alt"와 같은 키 조합을 나타내는 보다 일반적인 구문이 태그에서 지원됩니다.
속성 및 이벤트 멤버 이름 참조
특성을 지정할 때는 포함 개체 요소에 대해 인스턴스화한 CLR 형식의 멤버인 속성이나 이벤트를 참조할 수 있습니다.
또는 포함 개체 요소와는 별개로 연결된 속성 또는 연결된 이벤트를 참조할 수 있습니다.
또한 부분적으로 정규화된 이름인 typeName.event를 사용하여 기본 네임스페이스를 통해 액세스 가능한 모든 개체의 모든 이벤트에 이름을 지정할 수도 있습니다. 이 구문은 라우트된 이벤트에 대해 처리기를 연결할 수 있도록 지원합니다. 여기서 처리기는 자식 요소에서 라우팅되었지만 부모 요소의 멤버 표에 없는 이벤트를 처리합니다. 이 구문은 연결된 이벤트 구문과 비슷하지만 여기서 이벤트는 실제 연결된 이벤트가 아니라, 정규화된 이름을 사용하여 이벤트를 참조하는 것입니다. 자세한 내용은 라우트된 이벤트 개요를 참조하십시오.
속성 이름은 경우에 따라 특성 이름이 아니라 특성 값으로 제공되는데, 이 속성 이름에는 ownerType.dependencyPropertyName 형식으로 지정된 속성과 같은 한정자도 포함될 수 있습니다. 이는 스타일이나 템플릿을 XAML로 작성할 때 일반적으로 나타나는 경우입니다. 특성 값으로 제공된 속성 이름의 처리 규칙은 이와 다르며 설정 중인 속성의 형식과 스타일이나 템플릿에 대상 형식이 있는지 여부와 같은 일부 컨텍스트 요소에 따라 결정됩니다. 자세한 내용은 스타일 지정 및 템플릿을 참조하십시오.
속성 이름은 특성 값이 속성 간 관계를 설명할 때에도 사용됩니다. 이 기능은 데이터 바인딩 및 Storyboard 대상에 사용되며 PropertyPath 클래스 및 형식 변환기를 통해 활성화됩니다. 조회 의미 체계에 대한 자세한 설명은 PropertyPath XAML 구문을 참조하십시오.
속성 요소 구문
속성 요소 구문은 기본 XML 구문과 다소 다른 구문입니다. XML에서 특성 값은 사실상 문자열과 같으며, 사용되는 문자열 인코딩 형식만 다를 수 있습니다. XAML에서는 다른 개체 요소를 속성의 값이 되도록 할당할 수 있습니다. 이 기능은 속성 요소 구문을 통해 활성화됩니다. 속성을 요소 태그 안에 특성으로 지정하는 대신 elementTypeName.propertyName 형식으로 여는 요소 태그를 사용하여 속성을 지정하고 속성의 값을 지정한 다음 속성 요소를 닫습니다.
다시 말해 구문은 왼쪽 꺾쇠괄호(<)로 시작하여 그 뒤에 속성 요소 구문이 포함된 클래스나 구조의 형식 이름이 바로 이어집니다. 그 뒤에는 하나의 점(.), 지정된 형식의 멤버 테이블 안에 있어야 하는 속성의 이름, 오른쪽 꺾쇠괄호(>)가 차례로 이어집니다. 속성에 할당할 값은 속성 요소 안에 포함됩니다. 개체를 값으로 지정하는 경우는 속성 요소 구문으로 충족해야 하는 상황이므로 일반적으로 값은 하나 이상의 개체 요소로 지정됩니다. 마지막으로, 동일한 elementTypeName.propertyName 조합을 지정하는 동등한 닫는 태그를 다른 요소 태그와 적절한 중첩을 이루어 균형되게 제공해야 합니다. 예를 들어 다음은 Button의 ContextMenu 속성에 대한 속성 요소 구문입니다.
<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의 공백 처리를 참조하십시오.
속성 요소는 논리 트리에 표시되지 않습니다. 속성 요소는 속성을 설정하기 위한 특정 구문일 뿐이며 이를 지원하는 인스턴스나 개체가 있는 요소가 아닙니다.
컬렉션 형식을 위한 속성 요소 구문
XAML 사양에서는 XAML 처리가 구현이 컬렉션 값 형식의 속성을 식별할 수 있어야 합니다. WPF 구현은 관리되는 코드를 기반으로 하며 해당 XAML 프로세서는 다음 중 하나를 통해 컬렉션 형식을 식별합니다.
IList 구현
IDictionary 구현
Array에서 파생(XAML에서의 배열에 대한 자세한 내용은 x:Array 태그 확장 참조)
속성의 형식이 컬렉션인 경우에는 유추된 컬렉션 형식을 태그에 지정할 필요가 없습니다. 대신 컬렉션의 요소가 될 요소를 컬렉션 형식 속성 요소의 하나 이상의 자식 요소로 지정합니다. 이러한 각 요소는 로드 도중 개체로 평가되며 암시적 컬렉션의 Add 메서드 호출을 통해 컬렉션에 추가됩니다. 예를 들어 Style의 Triggers 속성은 특수화된 컬렉션 형식 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>)는 WPF XAML 프로세서에 의해 컬렉션 삭제에서 지원되지 않습니다. 하지만 List<T> 클래스는 IList를 직접 구현하므로 이를 기본 클래스로 사용할 수 있습니다. 또는 Dictionary<TKey, TValue> 클래스는 IDictionary를 직접 구현하므로 이를 기본 클래스로 사용할 수도 있습니다.
XAML 콘텐츠 구문
XAML 콘텐츠 구문은 ContentPropertyAttribute를 클래스 선언의 일부로 지정하는 클래스에서만 활성화되는 구문입니다. ContentPropertyAttribute에는 해당 요소 형식(파생된 클래스 포함)의 콘텐츠 속성이 되도록 정의되는 이름으로 속성을 지정하는 매개 변수가 필요합니다. 따라서 지정된 속성은 요소의 XAML 콘텐츠 속성입니다. XAML 프로세서에서 처리될 때 요소의 여는 태그와 닫는 태그 사이에 있는 모든 자식 요소 또는 내부 텍스트는 해당 XAML 콘텐츠 속성의 값으로 할당됩니다. 필요한 경우 콘텐츠 속성의 속성 요소를 지정하고 해당 태그를 명시적으로 만들 수 있습니다. 이 기술은 경우에 따라 태그 명확성 또는 태그 스타일로서 의미가 있지만 일반적으로 콘텐츠 속성의 용도는 부모-자식으로 직접 연결된 요소가 바로 중첩될 수 있도록 태그를 효율적으로 사용하기 위한 것입니다. 요소의 다른 속성에 대한 속성 요소 태그는 "콘텐츠"로 할당되지 않습니다. 이러한 태그는 미리 파서 워크플로에서 처리되고 "콘텐츠"로 간주되지 않습니다.
다른 속성과 마찬가지로 개체의 XAML 콘텐츠 속성은 특정한 형식이 됩니다. 이 형식은 Object 형식일 수 있습니다. 이러한 콘텐츠 속성의 형식은 개체의 콘텐츠 모델을 정의하는 데 도움이 됩니다. 예를 들어 Object의 형식은 모든 개체가 콘텐츠가 될 수 있다는 점에서 느슨하지만 이렇게 형식이 느슨하더라도 콘텐츠는 단일 개체여야 합니다. 단일 개체는 컬렉션 개체일 수 있지만 콘텐츠에는 이러한 컬렉션 개체가 하나만 할당될 수 있습니다.
WPF 설명서에서 특정 형식의 콘텐츠 모델은 해당 형식의 클래스 페이지에서 설명하거나, 형식 패밀리에 대한 별도의 개념 항목으로 작성되어 관련된 각 형식 참조로 링크될 수 있습니다.
컬렉션 형식의 콘텐츠 구문
콘텐츠에서 두 개 이상의 개체 요소(또는 내부 텍스트)를 사용하려면 콘텐츠 속성의 형식이 컬렉션 형식이어야 합니다. 컬렉션 형식의 속성 요소 구문처럼, 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에 소개된 프로그래밍 개념입니다. 연결된 속성을 사용하도록 의도한 기본 시나리오는, 요소 트리의 자식 요소가 모든 요소에서 광범위하게 공유된 개체 모델이 없더라도 정보를 상위 요소에 보고할 수 있도록 하기 위한 것입니다. 이와 반대로 상위 요소도 이 연결된 속성을 사용하여 자식 요소에 정보를 보고할 수 있습니다. 연결된 속성의 용도와 연결된 속성을 직접 만드는 방법에 대해서는 연결된 속성 개요를 참조하십시오.
연결된 속성은 typeName.propertyName 조합도 지정한다는 점에서 속성 요소 구문과 외관상 비슷한 구문을 사용합니다. 하지만 중요한 두 가지 차이점이 있습니다.
특성 구문을 통해 연결된 속성을 설정할 때도 typeName.propertyName 조합을 사용할 수 있습니다. 연결된 속성은 특성 구문에서 정규화된 이름을 사용해야 한다는 요구 사항이 있는 유일한 경우입니다.
연결된 속성에 대해 속성 요소 구문을 사용할 수도 있습니다. 하지만 일반적인 속성 요소 구문의 경우 사용자가 지정하는 typeName은 속성 요소가 포함된 개체 요소입니다. 연결된 속성을 참조하는 경우 typeName은 개체 요소가 포함된 것이 아니라 연결된 속성을 정의하는 클래스입니다.
연결된 이벤트
연결된 이벤트는 이벤트를 형식으로 정의할 수 있지만 모든 개체에 처리기를 연결할 수 있는 XAML에서 소개된 프로그래밍 개념입니다. 연결된 이벤트를 정의하는 형식은 서비스를 정의하는 정적 형식인 경우가 많으며 경우에 따라서는 이러한 연결된 이벤트는 서비스를 노출하는 형식의 라우팅된 이벤트 별칭으로 노출됩니다. 연결된 이벤트에 대한 처리기는 특성 구문을 통해 지정합니다. 연결된 이벤트와 마찬가지로 특성 구문은 typeName.eventName을 사용할 수 있도록 연결 이벤트에 대해 확장됩니다. 여기서 typeName은 연결된 이벤트 인프라에 Add 및 Remove 이벤트 처리기 접근자를 제공하는 클래스이며 eventName은 이벤트 이름입니다.
Xml 네임스페이스
이전 구문 예제에서는 기본 네임스페이스 이외의 네임스페이스는 지정하지 않았습니다. 일반적으로 WPF 응용 프로그램에서 기본 네임스페이스는 WPF 네임스페이스로 지정됩니다. 기본 네임스페이스 이외의 네임스페이스를 지정할 수 있고 같은 종류의 구문을 사용할 수 있지만, 기본 네임스페이스 안에서 액세스할 수 없는 이름이 지정된 클래스의 경우에는 해당 클래스 이름 앞에 해당 CLR 네임스페이스를 매핑하는 데 사용된 XML 네임스페이스의 접두사를 붙여야 합니다. 예를 들어 <custom:MyElement/>는 MyElement 클래스의 인스턴스를 인스턴스화하기 위한 개체 요소 구문으로, 해당 클래스가 포함된 CLR 네임스페이스(그리고 해당 네임스페이스가 포함된 외부 어셈블리)가 이전에 custom 접두사로 매핑되었습니다.
XML 네임스페이스 및 XAML에 대한 자세한 내용은 XAML 네임스페이스 및 네임스페이스 매핑을 참조하십시오.
태그 확장
XAML에서는 특성 또는 개체 요소의 일반 XAML 프로세서 처리에서 벗어나고 처리를 백업 클래스로 연결할 수 있도록 하는 태그 확장 프로그래밍 엔터티를 정의합니다. XAML 프로세서의 WPF 구현에서는 MarkupExtension 추상 클래스를 WPF에서 지원되는 모든 태그 확장의 기본으로 사용합니다. 특성 구문을 사용할 때 태그 확장을 XAML 프로세서로 식별하는 문자는 여는 중괄호({) 뒤에 닫는 중괄호(}) 이외의 모든 문자를 사용하여 구성된 문자입니다. 여는 중괄호 뒤의 첫 번째 문자열은 특정 확장 동작을 제공하는 클래스를 참조해야 하며 하위 문자열이 실제 클래스 이름의 일부인 경우 참조에는 하위 문자열 "확장"을 생략할 수 있습니다. 그 뒤에는 하나의 공백을 지정할 수 있으며 그 뒤에 나오는 모든 문자는 닫는 중괄호가 나타나기 전까지 확장 구현에서 입력으로 사용됩니다. WPF 태그 확장의 기본 용도는 특성 구문을 사용하여 이미 존재하는 다른 개체 또는 런타임에 평가될 개체에 대한 지연된 참조를 참조할 수 있는 방법을 제공하는 것입니다. 예를 들어 특정 속성이 일반적으로 사용되는 값 형식 대신 {Binding} 태그 확장을 지정하여 간단한 데이터 바인딩을 수행할 수 있습니다. 태그 확장의 대부분은 일반적으로 특성 구문이 가능하지 않은 속성에 대해 특성 구문을 사용할 수 있게 해줍니다. 예를 들어 Style 개체는 각각 byref 개체를 받으며 기본 형식이 아닌 여러 개의 다른 속성이 포함된 비교적 복잡한 참조 형식입니다. 하지만 스타일은 일반적으로 리소스로 작성되며, 자원을 요청하는 두 태그 확장 중 하나를 통해 참조됩니다. 확장은 속성 값의 평가를 리소스 조회까지 연기하며 다음과 같은 속성 구문을 사용하면 확장을 통해 Style 속성의 값을 제공하고 Style 형식을 사용할 수 있습니다.
<Button Style="{StaticResource MyStyle}">My button</Button>
여기에서 StaticResource는 태그 확장 구현을 제공하는 StaticResourceExtension 클래스를 식별합니다. 다음 문자열 MyStyle은 기본값이 아닌 StaticResourceExtension 생성자의 입력으로 사용됩니다. 여기서 확장 문자열에서 가져온 매개 변수는 요청된 ResourceKey를 선언합니다. MyStyle은 리소스로 정의된 Style의 x:Key 특성 값으로 예상됩니다. StaticResource 태그 확장을 사용할 때는 로드 시 정적 리소스 조회 논리를 통해 Style 속성 값을 제공하기 위해 리소스를 사용해야 합니다.
태그 확장에 대한 자세한 내용은 태그 확장 및 XAML을 참조하십시오. 태그 확장 및 기타 XAML 프로그래밍 기능에 대한 참조 자료는 XAML 네임스페이스(x:) 언어 기능 및 WPF 네임스페이스 XAML 확장을 참조하십시오.
선택적 및 권장하지 않는 XAML 사용법
선택적 속성 요소 사용법
선택적 속성 요소 사용법에는 XAML 프로세서가 암시적으로 간주하는 요소 콘텐츠 속성을 구체적으로 지정하는 방법이 포함됩니다. 예를 들어 Menu의 콘텐츠를 선언할 때 Menu의 모든 자식 요소가 MenuItem이어야 하며 Items 컬렉션에 배치되어야 하는 암시적 XAML 처리가 동작을 사용하는 대신, Menu의 Items 컬렉션을 <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를 정의하며 Control이 Button 기본 클래스이기 때문에 작동합니다.
하지만 다음 typeName.memberName 형식 예제는 작동하지 않으며 따라서 주석으로 표시됩니다.
<!--<Button Label.Background="Blue">Does not work</Button> -->
Label은 Control의 다른 파생 클래스이며 Label.Background를 Label 개체 요소 안에서 지정한 경우 이 사용법은 동작합니다. 하지만 Label은 Button의 클래스 또는 기본 클래스가 아니기 때문에 지정된 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은 적합하지 않은 태그 스타일이며 사용하지 않는 것이 좋습니다.