XAML 구문 정보XAML Syntax In Detail

이 항목에서는 XAML 구문의 요소를 설명 하는 데 사용 되는 용어를 정의 합니다.This topic defines the terms that are used to describe the elements of XAML syntax. 이러한 용어는이 설명서의 나머지 부분 전체에서 자주 사용 됩니다. WPF 설명서와 XAML을 사용 하는 다른 프레임 워크 또는 system.xaml 수준에서 XAML 언어 지원에 의해 설정 된 기본 XAML 개념에 대해 자주 사용 됩니다.These terms are used frequently throughout the remainder of this documentation, both for WPF documentation specifically and for the other frameworks that use XAML or the basic XAML concepts enabled by the XAML language support at the System.Xaml level. 이 항목에서는 XAML 개요 (WPF)항목에서 소개 하는 기본 용어를 확장 합니다.This topic expands on the basic terminology introduced in the topic XAML Overview (WPF).

XAML 언어 사양The XAML Language Specification

여기에 정의 된 XAML 구문 용어는 XAML 언어 사양 내 에서도 정의 되거나 참조 됩니다.The XAML syntax terminology defined here is also defined or referenced within the XAML language specification. XAML은 XML을 기반으로 하는 언어 이며 XML 구조 규칙에 따라 다음을 수행 하거나 확장 합니다.XAML is a language based on XML and follows or expands upon XML structural rules. 일부 용어는에서 공유 되거나 XML 언어 또는 XML 문서 개체 모델을 설명할 때 일반적으로 사용 되는 용어를 기반으로 합니다.Some of the terminology is shared from or is based on the terminology commonly used when describing the XML language or the XML document object model.

Xaml 언어 사양에 대 한 자세한 내용은 Microsoft 다운로드 센터에서 [MS] -xaml 을 다운로드 하세요.For more information about the XAML language specification, download [MS-XAML] from the Microsoft Download Center.

XAML 및 CLRXAML and CLR

XAML은 태그 언어입니다.XAML is a markup language. 이름으로 암시 된 CLR (공용 언어 런타임)은 런타임 실행을 가능 하 게 합니다.The common language runtime (CLR), as implied by its name, enables runtime execution. XAML은 CLR 런타임에서 직접 사용 하는 공용 언어 중 하나가 아닙니다.XAML is not by itself one of the common languages that is directly consumed by the CLR runtime. 대신 XAML을 자체 형식 시스템을 지 원하는 것으로 간주할 수 있습니다.Instead, you can think of XAML as supporting its own type system. WPF에서 사용 되는 특정 XAML 구문 분석 시스템은 CLR 및 CLR 형식 시스템을 기반으로 합니다.The particular XAML parsing system that is used by WPF is built on the CLR and the CLR type system. WPF에 대 한 XAML이 구문 분석 될 때 런타임 표현을 인스턴스화하기 위해 XAML 형식이 CLR 형식에 매핑됩니다.XAML types are mapped to CLR types to instantiate a run time representation when the XAML for WPF is parsed. 이러한 이유로이 문서의 구문에 대 한 나머지 부분에는 XAML 언어 사양의 동일한 구문 토론이 아닌 경우에도 CLR 형식 시스템에 대 한 참조가 포함 됩니다.For this reason, the remainder of discussion of syntax in this document will include references to the CLR type system, even though the equivalent syntax discussions in the XAML language specification do not. Xaml 언어 사양 수준에 따라 XAML 형식은 다른 형식 시스템에 매핑될 수 있습니다. CLR 일 필요는 없지만 다른 XAML 파서의 생성 및 사용이 필요 합니다.(Per the XAML language specification level, XAML types could be mapped to any other type system, which does not have to be the CLR, but that would require the creation and use of a different XAML parser.)

형식 및 클래스 상속의 멤버Members of Types and Class Inheritance

WPFWPF 형식의 XAML 멤버로 표시 되는 속성 및 이벤트는 기본 형식에서 상속 되는 경우가 많습니다.Properties and events as they appear as XAML members of a WPFWPF type are often inherited from base types. 예를 들어 다음 <Button Background="Blue" .../>예제를 참조 하세요.For example, consider this example: <Button Background="Blue" .../>. 클래스 정의, 리플렉션 결과 또는 설명서를 확인 하려는 Button 경우 속성은클래스의바로선언된속성이아닙니다.BackgroundThe Background property is not an immediately declared property on the Button class, if you were to look at the class definition, reflection results, or the documentation. 대신는 기본 Control 클래스에서 상속 됩니다. BackgroundInstead, Background is inherited from the base Control class.

WPFWPF XAML 요소의 클래스 상속 동작은 XML 태그의 스키마 적용 해석에서 상당한 출발입니다.The class inheritance behavior of WPFWPF XAML elements is a significant departure from a schema-enforced interpretation of XML markup. 클래스 상속은 특히 중간 기본 클래스가 추상 이거나 인터페이스가 포함 된 경우 복잡할 수 있습니다.Class inheritance can become complex, particularly when intermediate base classes are abstract, or when interfaces are involved. 이는 DTD 또는 XSD 형식과 같이 일반적으로 프로그래밍에 XMLXML 사용 되는 스키마 유형을 사용 하 여 XAML 요소 집합 및 해당 특성의 허용 되는 특성을 정확 하 게 표현 하기 어려운 한 가지 이유입니다.This is one reason that the set of XAML elements and their permissible attributes is difficult to represent accurately and completely using the schema types that are typically used for XMLXML programming, such as DTD or XSD format. 또 다른 이유는 XAML 언어 자체의 확장성 및 형식 매핑 기능에서 허용 되는 형식 및 멤버의 고정 표현의 완전성을 배제 한다는 것입니다.Another reason is that extensibility and type-mapping features of the XAML language itself preclude completeness of any fixed representation of the permissible types and members.

개체 요소 구문Object Element Syntax

개체 요소 구문은 XML 요소를 선언 하 여 CLR 클래스 또는 구조체를 인스턴스화하는 XAML 태그 구문입니다.Object element syntax is the XAML markup syntax that instantiates a CLR class or structure by declaring an XML element. 이 구문은 HTML과 같은 다른 태그 언어의 요소 구문과 유사 합니다.This syntax resembles the element syntax of other markup languages such as HTML. 개체 요소 구문은 왼쪽 꺾쇠 괄호 (<)로 시작 하 고 인스턴스화된 클래스 또는 구조체의 형식 이름 바로 뒤에 나옵니다.Object element syntax begins with a left angle bracket (<), followed immediately by the type name of the class or structure being instantiated. 0 개 이상의 공백이 형식 이름 뒤에 올 수 있으며, 개체 요소에서 0 개 이상의 특성을 선언할 수 있으며 각 특성 이름 = "value" 쌍을 구분 하는 하나 이상의 공백이 있습니다.Zero or more spaces can follow the type name, and zero or more attributes may also be declared on the object element, with one or more spaces separating each attribute name="value" pair. 마지막으로 다음 중 하나를 충족 해야 합니다.Finally, one of the following must be true:

  • 요소와 태그는 슬래시 (/) 뒤에 오른쪽 꺾쇠 괄호 (>)로 즉시 닫혀야 합니다.The element and tag must be closed by a forward slash (/) followed immediately by a right angle bracket (>).

  • 여는 태그는 오른쪽 꺾쇠 괄호 (>)로 완료 되어야 합니다.The opening tag must be completed by a right angle bracket (>). 다른 개체 요소, 속성 요소 또는 내부 텍스트는 여는 태그 뒤에 올 수 있습니다.Other object elements, property elements, or inner text, can follow the opening tag. 여기에 포함 될 수 있는 콘텐츠는 일반적으로 요소의 개체 모델에 의해 제한 됩니다.Exactly what content may be contained here is typically constrained by the object model of the element. 개체 요소에 해당 하는 닫는 태그도 있어야 하며, 적절 한 중첩 및 다른 여는 태그 쌍과의 균형을 유지 해야 합니다.The equivalent closing tag for the object element must also exist, in proper nesting and balance with other opening and closing tag pairs.

.NET에 의해 구현 되는 XAML에는 개체 요소를 형식, 특성에 속성 또는 이벤트에 매핑하는 규칙 집합, CLR 네임 스페이스와 어셈블리에 XAML 네임 스페이스가 있습니다.XAML as implemented by .NET has a set of rules that map object elements into types, attributes into properties or events, and XAML namespaces to CLR namespaces plus assembly. WPF 및 .NET의 경우 XAML 개체 요소가 참조 된 어셈블리에 정의 된 .NET 형식에 매핑되고 특성은 해당 형식의 멤버에 매핑됩니다.For WPF and .NET, XAML object elements map to .NET types as defined in referenced assemblies, and the attributes map to members of those types. XAML에서 CLR 형식을 참조 하는 경우 해당 형식의 상속 된 멤버에도 액세스할 수 있습니다.When you reference a CLR type in XAML, you have access to the inherited members of that type as well.

예를 들어 다음 예제는 Button 클래스의 새 인스턴스를 인스턴스화하는 개체 요소 구문이 며 특성 및 해당 특성에 대 한 값도 Name 지정 합니다.For example, the following example is object element syntax that instantiates a new instance of the Button class, and also specifies a Name attribute and a value for that attribute:

<Button Name="CheckoutButton"/>

다음 예제는 XAML 콘텐츠 속성 구문도 포함 하는 개체 요소 구문입니다.The following example is object element syntax that also includes XAML content property syntax. 내에 포함 된 내부 텍스트는 TextBox XAML 콘텐츠 속성인를 Text설정 하는 데 사용 됩니다.The inner text contained within will be used to set the TextBox XAML content property, Text.

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

콘텐츠 모델Content Models

클래스는 구문을 사용 하 여 XAML 개체 요소로 사용을 지원할 수 있지만이 요소는 전체 콘텐츠 모델 또는 요소 트리의 예상 위치에 배치 된 경우에만 응용 프로그램 또는 페이지에서 제대로 작동 합니다.A class might support a usage as a XAML object element in terms of the syntax, but that element will only function properly in an application or page when it is placed in an expected position of an overall content model or element tree. 예를 들어, MenuItem 은 일반적으로와 Menu같은 MenuBase 파생 클래스의 자식 으로만 배치 되어야 합니다.For example, a MenuItem should typically only be placed as a child of a MenuBase derived class such as Menu. 특정 요소에 대 한 콘텐츠 모델은 XAML 요소로 사용할 수 있는 컨트롤 및 기타 WPFWPF 클래스에 대 한 클래스 페이지에 대 한 설명의 일부로 설명 됩니다.Content models for specific elements are documented as part of the remarks on the class pages for controls and other WPFWPF classes that can be used as XAML elements.

개체 요소의 속성Properties of Object Elements

XAML의 속성은 가능한 여러 구문으로 설정 됩니다.Properties in XAML are set by a variety of possible syntaxes. 특정 속성에 사용할 수 있는 구문은 설정 중인 속성의 기본 형식 시스템 특성에 따라 달라 집니다.Which syntax can be used for a particular property will vary, based on the underlying type system characteristics of the property that you are setting.

속성 값을 설정 하 여 런타임 개체 그래프에 있는 개체에 기능 또는 특징을 추가 합니다.By setting values of properties, you add features or characteristics to objects as they exist in the run time object graph. 개체 요소에서 만든 개체의 초기 상태는 매개 변수가 없는 생성자 동작을 기반으로 합니다.The initial state of the created object from a object element is based on the parameterless constructor behavior. 일반적으로 응용 프로그램은 지정 된 개체의 완전히 기본 인스턴스 이외의 다른 항목을 사용 합니다.Typically, your application will use something other than a completely default instance of any given object.

특성 구문(속성)Attribute Syntax (Properties)

특성 구문은 기존 개체 요소에 특성을 선언 하 여 속성에 대 한 값을 설정 하는 XAML 태그 구문입니다.Attribute syntax is the XAML markup syntax that sets a value for a property by declaring an attribute on an existing object element. 특성 이름은 관련 개체 요소를 지 원하는 클래스의 속성에 대 한 CLR 멤버 이름과 일치 해야 합니다.The attribute name must match the CLR member name of the property of the class that backs the relevant object element. 특성 이름 다음에는 할당 연산자 (=)가 나옵니다.The attribute name is followed by an assignment operator (=). 특성 값은 따옴표로 묶인 문자열 이어야 합니다.The attribute value must be a string enclosed within quotes.

참고

교대로 반복 되는 따옴표를 사용 하 여 특성 안에 리터럴 따옴표를 추가할 수 있습니다.You can use alternating quotes to place a literal quotation mark within an attribute. 예를 들어 큰따옴표를 사용 하 여 큰따옴표 문자를 포함 하는 문자열을 선언할 수 있습니다.For instance you can use single quotes as a means to declare a string that contains a double quote character within it. 작은따옴표 또는 큰따옴표를 사용 하는 경우에는 일치 하는 쌍을 사용 하 여 특성 값 문자열을 열고 닫아야 합니다.Whether you use single or double quotes, you should use a matching pair for opening and closing the attribute value string. 특정 XAML 구문에 적용 되는 문자 제한을 해결 하는 데 사용할 수 있는 이스케이프 시퀀스 또는 기타 기술도 있습니다.There are also escape sequences or other techniques available for working around character restrictions imposed by any particular XAML syntax. XML 문자 엔터티 및 XAML을참조 하세요.See XML Character Entities and XAML.

특성 구문을 통해 설정 하려면 속성이 public 이어야 하며 쓰기 가능 해야 합니다.In order to be set through attribute syntax, a property must be public and must be writeable. 지원 형식 시스템의 속성 값은 값 형식 이어야 하며, 관련 된 지원 형식에 액세스할 때 XAML 프로세서가 인스턴스화하거나 참조할 수 있는 참조 형식 이어야 합니다.The value of the property in the backing type system must be a value type, or must be a reference type that can be instantiated or referenced by a XAML processor when accessing the relevant backing type.

WPF XAML 이벤트의 경우 특성 이름으로 참조 되는 이벤트는 public 이어야 하며 public 대리자가 있어야 합니다.For WPF XAML events, the event that is referenced as the attribute name must be public and have a public delegate.

속성이 나 이벤트는 포함 하는 개체 요소에 의해 인스턴스화된 클래스 또는 구조체의 멤버 여야 합니다.The property or event must be a member of the class or structure that is instantiated by the containing object element.

특성 값 처리Processing of Attribute Values

여는 따옴표와 닫는 따옴표 안에 포함 된 문자열 값은 XAML 프로세서에 의해 처리 됩니다.The string value contained within the opening and closing quotation marks is processed by a XAML processor. 속성의 경우 기본 처리 동작은 기본 CLR 속성의 형식에 따라 결정 됩니다.For properties, the default processing behavior is determined by the type of the underlying CLR property.

이 처리 순서를 사용 하 여 특성 값은 다음 중 하나로 채워집니다.The attribute value is filled by one of the following, using this processing order:

  1. XAML 프로세서가 중괄호 또는에서 MarkupExtension파생 되는 개체 요소를 발견할 경우 값을 문자열로 처리 하는 대신 참조 된 태그 확장이 먼저 평가 되 고 태그 확장에서 반환 된 개체가로 사용 됩니다. 기본값.If the XAML processor encounters a curly brace, or an object element that derives from MarkupExtension, then the referenced markup extension is evaluated first rather than processing the value as a string, and the object returned by the markup extension is used as the value. 대부분의 경우 태그 확장에서 반환 되는 개체는 기존 개체에 대 한 참조 또는 런타임까지 계산을 지연 하는 식이 며 새로 인스턴스화된 개체가 아닙니다.In many cases the object returned by a markup extension will be a reference to an existing object, or an expression that defers evaluation until run time, and is not a newly instantiated object.

  2. 속성이 특성 TypeConverter을 사용 하 여 선언 되거나 해당 속성의 값 형식이 특성 TypeConverter을 사용 하 여 선언 된 경우 특성의 문자열 값이 변환 입력으로 형식 변환기에 전송 되 고 변환기에서 반환 됩니다. 새 개체 인스턴스입니다.If the property is declared with an attributed TypeConverter, or the value type of that property is declared with an attributed TypeConverter, the string value of the attribute is submitted to the type converter as a conversion input, and the converter will return a new object instance.

  3. TypeConverter없으면 속성 형식으로 직접 변환 하려고 시도 합니다.If there is no TypeConverter, a direct conversion to the property type is attempted. 이 최종 수준은 XAML 언어 기본 형식 사이의 파서 네이티브 값에서 직접 변환 하거나, 열거형의 명명 된 상수 이름을 확인 하는 것입니다. 파서는 일치 하는 값에 액세스 합니다.This final level is a direct conversion at the parser-native value between XAML language primitive types, or a check for the names of named constants in an enumeration (the parser then accesses the matching values).

열거 특성 값Enumeration Attribute Values

XAML의 열거는 XAML 파서에서 내부적으로 처리 되며 열거형의 멤버는 열거형의 명명 된 상수 중 하나의 문자열 이름을 지정 하 여 지정 해야 합니다.Enumerations in XAML are processed intrinsically by XAML parsers, and the members of an enumeration should be specified by specifying the string name of one of the enumeration's named constants.

플래그가 지정 되지 않은 열거형 값의 경우 기본 동작은 특성 값의 문자열을 처리 하 고 열거형 값 중 하나로 확인 하는 것입니다.For nonflag enumeration values, the native behavior is to process the string of an attribute value and resolve it to one of the enumeration values. 형식 열거에서 열거형을 지정 하지 않습니다. 입니다.You do not specify the enumeration in the format Enumeration.Value, as you do in code. 대신 만 지정 하면 설정 하는 속성의 형식에 따라 열거가 유추 됩니다.Instead, you specify only Value, and Enumeration is inferred by the type of the property you are setting. 열거형의 특성을 지정 하는 경우 형식이 면 제대로 확인 되지 않습니다.If you specify an attribute in the Enumeration.Value form, it will not resolve correctly.

플래그 열거형의 경우 동작은 Enum.Parse 메서드를 기반으로 합니다.For flagwise enumerations, the behavior is based on the Enum.Parse method. 각 값을 쉼표로 구분 하 여 플래그 열거에 대 한 값을 여러 개 지정할 수 있습니다.You can specify multiple values for a flagwise enumeration by separating each value with a comma. 그러나 플래그가 아닌 열거형 값은 결합할 수 없습니다.However, you cannot combine enumeration values that are not flagwise. 예를 들어, 쉼표 구문을 사용 하 여 nonflag 열거형의 여러 Trigger 조건에 대해 작동 하는을 만들 수 없습니다.For instance, you cannot use the comma syntax to attempt to create a Trigger that acts on multiple conditions of a nonflag enumeration:

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

XAML로 설정할 수 있는 특성을 지 원하는 플래그 열거형은 WPF에서 드물게 발생 합니다.Flagwise enumerations that support attributes that are settable in XAML are rare in WPF. 그러나 이러한 열거형 중 하나는 StyleSimulations입니다.However, one such enumeration is StyleSimulations. 예를 들어 쉼표로 구분 된 플래그 특성 구문을 사용 하 여 Glyphs 클래스에 대 한 설명에 제공 된 예제를 수정할 수 있습니다. StyleSimulations = "BoldSimulation" 가 될StyleSimulations = "BoldSimulation,ItalicSimulation"수 있습니다.You could, for instance, use the comma-delimited flagwise attribute syntax to modify the example provided in the Remarks for the Glyphs class; StyleSimulations = "BoldSimulation" could become StyleSimulations = "BoldSimulation,ItalicSimulation". KeyBinding.Modifiers둘 이상의 열거형 값을 지정할 수 있는 또 다른 속성입니다.KeyBinding.Modifiers is another property where more than one enumeration value can be specified. 그러나 열거형에서 ModifierKeys 자체 형식 변환기를 지원 하기 때문에이 속성은 특별 한 경우에만 발생 합니다.However, this property happens to be a special case, because the ModifierKeys enumeration supports its own type converter. 한정자에 대 한 형식 변환기는 쉼표 (,)가 아닌 더하기 기호 (+)를 구분 기호로 사용 합니다.The type converter for modifiers uses a plus sign (+) as a delimiter rather than a comma (,). 이 변환은 "Ctrl + Alt"와 같이 Microsoft Windows 프로그래밍의 키 조합을 나타내는 보다 일반적인 구문을 지원 합니다.This conversion supports the more traditional syntax to represent key combinations in Microsoft Windows programming, such as "Ctrl+Alt".

속성 및 이벤트 멤버 이름 참조Properties and Event Member Name References

특성을 지정 하는 경우 포함 하는 개체 요소에 대해 인스턴스화한 CLR 형식의 멤버로 존재 하는 속성 또는 이벤트를 참조할 수 있습니다.When specifying an attribute, you can reference any property or event that exists as a member of the CLR type you instantiated for the containing object element.

또는 포함 하는 개체 요소와 관계 없이 연결 된 속성 또는 연결 된 이벤트를 참조할 수 있습니다.Or, you can reference an attached property or attached event, independent of the containing object element. (연결 된 속성은 이후의 섹션에서 설명 합니다.)(Attached properties are discussed in an upcoming section.)

또한 typeName을 사용 하 여 기본 네임 스페이스를 통해 액세스할 수 있는 모든 개체에서 이벤트의 이름을 지정할 수 있습니다. 부분적으로 정규화 된 이벤트 이름; 이 구문은 자식 요소에서 라우트된 이벤트를 처리 하기 위해 처리기를 사용 하는 라우트된 이벤트에 대 한 처리기를 연결 하는 것을 지원 하지만, 부모 요소의 members 테이블에도 해당 이벤트가 없습니다.You can also name any event from any object that is accessible through the default namespace by using a typeName.event partially qualified name; this syntax supports attaching handlers for routed events where the handler is intended to handle events routing from child elements, but the parent element does not also have that event in its members table. 이 구문은 연결 된 이벤트 구문과 유사 하지만 여기에 있는 이벤트는 진정한 연결 된 이벤트가 아닙니다.This syntax resembles an attached event syntax, but the event here is not a true attached event. 대신 정규화 된 이름을 가진 이벤트를 참조 합니다.Instead, you are referencing an event with a qualified name. 자세한 내용은 라우트된 이벤트 개요합니다.For more information, see Routed Events Overview.

일부 시나리오에서는 속성 이름이 특성 이름이 아니라 특성의 값으로 제공 되는 경우도 있습니다.For some scenarios, property names are sometimes provided as the value of an attribute, rather than the attribute name. 해당 속성 이름에는 ownerType형식으로 지정 된 속성과 같은 한정자도 포함 될 수 있습니다. dependencyPropertyName.That property name can also include qualifiers, such as the property specified in the form ownerType.dependencyPropertyName. 이 시나리오는 XAML에서 스타일이 나 템플릿을 작성할 때 일반적입니다.This scenario is common when writing styles or templates in XAML. 특성 값으로 제공 되는 속성 이름에 대 한 처리 규칙은 서로 다르며, 설정 되는 속성의 형식이 나 특정 WPF 하위 시스템의 동작에 의해 제어 됩니다.The processing rules for property names provided as an attribute value are different, and are governed by the type of the property being set or by the behaviors of particular WPF subsystems. 자세한 내용은 스타일 지정 및 템플릿을 참조 하세요.For details, see Styling and Templating.

속성 이름에 대 한 다른 용도는 특성 값이 속성 속성 관계를 설명 하는 경우입니다.Another usage for property names is when an attribute value describes a property-property relationship. 이 기능은 데이터 바인딩과 스토리 보드 대상에 사용 되며 PropertyPath 클래스와 해당 형식 변환기로 설정 됩니다.This feature is used for data binding and for storyboard targets, and is enabled by the PropertyPath class and its type converter. 조회 의미 체계에 대 한 자세한 설명은 PROPERTYPATH XAML 구문을 참조 하세요.For a more complete description of the lookup semantics, see PropertyPath XAML Syntax.

속성 요소 구문Property Element Syntax

Property 요소 구문은 요소에 대 한 기본 XML 구문 규칙에서 달라 지므로 하는 구문입니다.Property element syntax is a syntax that diverges somewhat from the basic XML syntax rules for elements. XML에서 특성의 값은 사실상 문자열이 며 문자열 인코딩 형식만 사용 되는 경우에만 가능한 변형입니다.In XML, the value of an attribute is a de facto string, with the only possible variation being which string encoding format is being used. XAML에서 다른 개체 요소를 속성의 값으로 할당할 수 있습니다.In XAML, you can assign other object elements to be the value of a property. 이 기능은 속성 요소 구문에 의해 활성화 됩니다.This capability is enabled by the property element syntax. 요소 태그 내에서 특성으로 지정 되는 속성 대신 Elementtypename의 여는 요소 태그를 사용 하 여 속성을 지정 합니다. propertyName 폼, 속성 값이 내에서 지정 된 다음 property 요소가 닫혀 있습니다.Instead of the property being specified as an attribute within the element tag, the property is specified using an opening element tag in elementTypeName.propertyName form, the value of the property is specified within, and then the property element is closed.

특히 구문은 왼쪽 꺾쇠 괄호 (<)로 시작 하 고 그 뒤에는 속성 요소 구문이 포함 된 클래스 또는 구조체의 형식 이름이 바로 앞에 옵니다.Specifically, the syntax begins with a left angle bracket (<), followed immediately by the type name of the class or structure that the property element syntax is contained within. 이 바로 뒤에는 단일 점 (.), 속성 이름, 오른쪽 꺾쇠 괄호 (>) 순으로 차례로 옵니다.This is followed immediately by a single dot (.), then by the name of a property, then by a right angle bracket (>). 특성 구문과 마찬가지로 해당 속성은 지정 된 형식의 선언 된 public 멤버 내에 있어야 합니다.As with attribute syntax, that property must exist within the declared public members of the specified type. 속성에 할당할 값은 property 요소에 포함 됩니다.The value to be assigned to the property is contained within the property element. 일반적으로이 값은 하나 이상의 개체 요소로 지정 됩니다. 개체를 값으로 지정 하는 시나리오는 속성 요소 구문이 처리할 시나리오 이기 때문입니다.Typically, the value is given as one or more object elements, because specifying objects as values is the scenario that property element syntax is intended to address. 마지막으로 동일한 Elementtypename을 지정 하는 상응 하는 닫는 태그입니다. propertyName 조합을 제공 해야 하며, 적절 한 중첩 및 다른 요소 태그와 균형을 맞추어야 합니다.Finally, an equivalent closing tag specifying the same elementTypeName.propertyName combination must be provided, in proper nesting and balance with other element tags.

예를 들어 다음은 ContextMenu Button의 속성에 대 한 속성 요소 구문입니다.For example, the following is property element syntax for the ContextMenu property of a Button.

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

속성 요소 내의 값은 지정 되는 속성 형식이와 String같은 기본 값 형식 이거나 이름이 지정 된 열거형 인 경우에도 내부 텍스트로 제공 될 수 있습니다.The value within a property element can also be given as inner text, in cases where the property type being specified is a primitive value type, such as String, or an enumeration where a name is specified. 이러한 두 가지 사용은 일반적이 지 않습니다. 이러한 각 경우에는 보다 간단한 특성 구문을 사용할 수도 있기 때문입니다.These two usages are somewhat uncommon, because each of these cases could also use a simpler attribute syntax. 속성 요소를 문자열로 채우는 한 가지 시나리오는 XAML 콘텐츠 속성이 아니지만 UI 텍스트 표현에 사용 되는 속성에 대 한 것 이며, 줄 바꿈과 같은 특정 공백 요소가 해당 UI 텍스트에 표시 되어야 합니다.One scenario for filling a property element with a string is for properties that are not the XAML content property but still are used for representation of UI text, and particular white-space elements such as linefeeds are required to appear in that UI text. 특성 구문은 줄 바꿈을 유지할 수 없지만, 유효 공백 유지가 활성화 되어 있으면 속성 요소 구문이 가능 합니다. 자세한 내용은 XAML의 공백 처리를 참조 하세요.Attribute syntax cannot preserve linefeeds, but property element syntax can, so long as significant white-space preservation is active (for details, see White space processing in XAML). 또 다른 시나리오는 X:Uid 지시문 을 property 요소에 적용 하 여의 값을 WPF 출력 BAML 또는 다른 기술에서 지역화 해야 하는 값으로 표시 하는 것입니다.Another scenario is so that x:Uid Directive can be applied to the property element and thus mark the value within as a value that should be localized in the WPF output BAML or by other techniques.

속성 요소는 WPF 논리 트리에 표시 되지 않습니다.A property element is not represented in the WPF logical tree. 속성 요소는 속성을 설정 하기 위한 특정 구문 이지만 인스턴스 또는 개체를 지 원하는 요소는 아닙니다.A property element is just a particular syntax for setting a property, and is not an element that has an instance or object backing it. 논리적 트리 개념에 대 한 자세한 내용은 WPF의 트리를 참조 하세요.(For details on the logical tree concept, see Trees in WPF.)

특성과 속성 요소 구문이 모두 지원 되는 속성의 경우 두 구문은 일반적으로 동일한 결과를 가집니다. 단, 공백 처리와 같은 세부 사항은 구문 사이에서 약간 다를 수 있습니다.For properties where both attribute and property element syntax are supported, the two syntaxes generally have the same result, although subtleties such as white-space handling can vary slightly between syntaxes.

컬렉션 구문Collection Syntax

XAML 사양에서는 값 형식이 컬렉션인 속성을 식별 하기 위해 XAML 프로세서 구현이 필요 합니다.The XAML specification requires XAML processor implementations to identify properties where the value type is a collection. .NET의 일반적인 XAML 프로세서 구현은 관리 코드 및 CLR을 기반으로 하며 다음 중 하나를 통해 컬렉션 형식을 식별 합니다.The general XAML processor implementation in .NET is based on managed code and the CLR, and it identifies collection types through one of the following:

속성 형식이 컬렉션인 경우에는 유추 된 컬렉션 형식을 개체 요소로 태그에 지정할 필요가 없습니다.If the type of a property is a collection, then the inferred collection type does not need to be specified in the markup as an object element. 대신 컬렉션의 항목으로 사용 되는 요소는 property 요소의 자식 요소로 하나 이상의 자식 요소로 지정 됩니다.Instead, the elements that are intended to become the items in the collection are specified as one or more child elements of the property element. 이러한 각 항목은 로드 하는 동안 개체로 계산 된 후 암시적 컬렉션의 Add 메서드를 호출 하 여 컬렉션에 추가 됩니다.Each such item is evaluated to an object during loading and added to the collection by calling the Add method of the implied collection. 예를 들어의 Triggers Style 속성은을 구현 IList하는 특수화 TriggerCollection된 컬렉션 형식을 사용 합니다.For example, the Triggers property of Style takes the specialized collection type TriggerCollection, which implements IList. 태그의 개체 요소를 TriggerCollection 인스턴스화할 필요는 없습니다.It is not necessary to instantiate a TriggerCollection object element in the markup. 대신 Style.Triggers 속성 요소 내에서 하나 이상의 Trigger 항목을 요소로 지정 합니다. 여기서 Trigger (또는 파생 클래스)은 강력한 형식 및 암시적 TriggerCollection의 항목 형식으로 예상 되는 형식입니다.Instead, you specify one or more Trigger items as elements within the Style.Triggers property element, where Trigger (or a derived class) is the type expected as the item type for the strongly typed and implicit 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 콘텐츠 속성 일 수 있습니다.A property may be both a collection type and the XAML content property for that type and derived types, which is discussed in the next section of this topic.

암시적 컬렉션 요소는 태그에 요소로 나타나지 않는 경우에도 논리적 트리 표현에서 멤버를 만듭니다.An implicit collection element creates a member in the logical tree representation, even though it does not appear in the markup as an element. 일반적으로 부모 형식의 생성자는 해당 속성 중 하나인 컬렉션에 대해 인스턴스화를 수행 하 고 처음에는 빈 컬렉션이 개체 트리의 일부가 됩니다.Usually the constructor of the parent type performs the instantiation for the collection that is one of its properties, and the initially empty collection becomes part of the object tree.

참고

제네릭 목록 및 사전 인터페이스 (IList<T>IDictionary<TKey,TValue>)는 컬렉션 검색에 대해 지원 되지 않습니다.The generic list and dictionary interfaces (IList<T> and IDictionary<TKey,TValue>) are not supported for collection detection. 그러나 클래스는 List<T> 직접 Dictionary<TKey,TValue>IList 구현IDictionary 하기 때문에 클래스를 기본 클래스로 사용할 수 있습니다.However, you can use the List<T> class as a base class, because it implements IList directly, or Dictionary<TKey,TValue> as a base class, because it implements IDictionary directly.

컬렉션 형식에 대 한 .NET 참조 페이지에서 컬렉션에 대 한 개체 요소를 의도적으로 생략 하는이 구문은 XAML 구문 섹션에서 암시적 컬렉션 구문으로 표시 되기도 합니다.In the .NET Reference pages for collection types, this syntax with the deliberate omission of the object element for a collection is occasionally noted in the XAML syntax sections as Implicit Collection Syntax.

루트 요소를 제외 하 고, 다른 요소의 자식 요소로 중첩 된 XAML 파일의 모든 개체 요소는 사실 부모 요소의 암시적 컬렉션 속성의 멤버 중 하나 또는 둘 다의 요소입니다. 또는 부모 요소에 대 한 XAML 콘텐츠 속성의 값을 지정 하는 요소입니다 (XAML 콘텐츠 속성은 이후의 섹션에서 설명).With the exception of the root element, every object element in a XAML file that is nested as a child element of another element is really an element that is one or both of the following cases: a member of an implicit collection property of its parent element, or an element that specifies the value of the XAML content property for the parent element (XAML content properties will be discussed in an upcoming section). 즉, 태그 페이지의 부모 요소와 자식 요소의 관계는 실질적으로 루트의 단일 개체 이며, 루트 아래의 모든 개체 요소는 부모의 속성 값을 제공 하는 단일 인스턴스이거나 col 내 항목 중 하나입니다. 부모의 컬렉션 형식 속성 값 이기도 한 lection입니다.In other words, the relationship of parent elements and child elements in a markup page is really a single object at the root, and every object element beneath the root is either a single instance that provides a property value of the parent, or one of the items within a collection that is also a collection-type property value of the parent. 이 단일 루트 개념은 XML에 공통적 이며와 같이 LoadXAML을 로드 하는 api의 동작에서 자주 강화 됩니다.This single-root concept is common with XML, and is frequently reinforced in the behavior of APIs that load XAML such as Load.

다음 예제는 명시적으로 지정 된 컬렉션GradientStopCollection에 대 한 개체 요소를 포함 하는 구문입니다.The following example is a syntax with the object element for a collection (GradientStopCollection) specified explicitly.

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

컬렉션을 명시적으로 선언 하는 것은 항상 가능 하지는 않습니다.Note that it is not always possible to explicitly declare the collection. 예를 들어, 이전에 TriggerCollection 표시 Triggers 된 예제에서를 명시적으로 선언 하려고 하면 실패 합니다.For instance, attempting to declare TriggerCollection explicitly in the previously shown Triggers example would fail. 컬렉션을 명시적으로 선언 하려면 컬렉션 클래스에서 매개 변수가 없는 생성자를 지원 해야 TriggerCollection 하 고 매개 변수가 없는 생성자가 없어야 합니다.Explicitly declaring the collection requires that the collection class must support a parameterless constructor, and TriggerCollection does not have a parameterless constructor.

XAML 콘텐츠 속성XAML Content Properties

XAML 콘텐츠 구문은를 ContentPropertyAttribute 해당 클래스 선언의 일부로 지정 하는 클래스 에서만 사용할 수 있는 구문입니다.XAML content syntax is a syntax that is only enabled on classes that specify the ContentPropertyAttribute as part of their class declaration. ContentPropertyAttribute 파생 클래스를 포함 하 여 해당 요소 형식에 대 한 콘텐츠 속성인 속성 이름을 참조 합니다.The ContentPropertyAttribute references the property name that is the content property for that type of element (including derived classes). XAML 프로세서에서 처리 하는 경우 개체 요소의 여는 태그와 닫는 태그 사이에 있는 모든 자식 요소나 내부 텍스트는 해당 개체에 대 한 XAML 콘텐츠 속성의 값으로 할당 됩니다.When processed by a XAML processor, any child elements or inner text that are found between the opening and closing tags of the object element will be assigned to be the value of the XAML content property for that object. Content 속성에 대 한 명시적 속성 요소를 지정할 수 있지만이 사용은 일반적으로 .NET 참조의 XAML 구문 섹션에 표시 되지 않습니다.You are permitted to specify explicit property elements for the content property, but this usage is not generally shown in the XAML syntax sections in the .NET reference. 명시적/자세한 기술 기술은 태그 명확성을 위해 또는 태그 스타일의 중요 한 값을 가지 지만, 일반적으로 콘텐츠 속성의 목적은 부모-자식과 직관적으로 관련 된 요소를 직접 중첩할 수 있도록 태그를 간소화 하는 것입니다.The explicit/verbose technique has occasional value for markup clarity or as a matter of markup style, but usually the intent of a content property is to streamline the markup so that elements that are intuitively related as parent-child can be nested directly. 요소의 다른 속성에 대 한 속성 요소 태그는 엄격한 XAML 언어 정의에 따라 "내용"으로 할당 되지 않습니다. 이러한 작업은 이전에 XAML 파서의 처리 순서에서 처리 되며 "내용"으로 간주 되지 않습니다.Property element tags for other properties on an element are not assigned as "content" per a strict XAML language definition; they are processed previously in the XAML parser's processing order and are not considered to be "content".

XAML 콘텐츠 속성 값은 연속적 이어야 합니다.XAML Content Property Values Must Be Contiguous

XAML 콘텐츠 속성의 값은 해당 개체 요소에 대 한 다른 속성 요소 보다 먼저 또는 완전히 뒤에 지정 해야 합니다.The value of a XAML content property must be given either entirely before or entirely after any other property elements on that object element. 이는 XAML 콘텐츠 속성의 값이 문자열 또는 하나 이상의 개체로 지정 되는지 여부에 해당 합니다.This is true whether the value of a XAML content property is specified as a string, or as one or more objects. 예를 들어 다음 태그는 구문 분석 하지 않습니다.For example, the following markup does not parse:

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

콘텐츠 속성의 속성 요소 구문을 사용 하 여이 구문을 명시적으로 만든 경우 content 속성을 두 번 설정 했기 때문에이는 기본적으로 유효 하지 않습니다.This is illegal essentially because if this syntax were made explicit by using property element syntax for the content property, then the content property would be set twice:

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

이와 유사한 잘못 된 예제는 content 속성이 컬렉션인 경우와 자식 요소가 속성 요소와 함께 사용 되는 경우입니다.A similarly illegal example is if the content property is a collection, and child elements are interspersed with property elements:

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

콘텐츠 속성 및 컬렉션 구문 조합Content Properties and Collection Syntax Combined

단일 개체 요소를 콘텐츠로 허용 하려면 콘텐츠 속성의 형식이 특히 컬렉션 형식 이어야 합니다.In order to accept more than a single object element as content, the type of the content property must specifically be a collection type. 컬렉션 형식에 대 한 속성 요소 구문과 마찬가지로 XAML 프로세서는 컬렉션 형식인 형식을 식별 해야 합니다.Similar to property element syntax for collection types, a XAML processor must identify types that are collection types. 요소에 XAML 콘텐츠 속성이 있고 XAML 콘텐츠 속성의 형식이 컬렉션인 경우에는 암시적 컬렉션 형식을 개체 요소로 태그에 지정할 필요가 없으며 XAML 콘텐츠 속성을 속성으로 지정할 필요가 없습니다. el 차서.If an element has a XAML content property and the type of the XAML content property is a collection, then the implied collection type does not need to be specified in the markup as an object element and the XAML content property does not need to be specified as a property element. 따라서 태그의 명백한 콘텐츠 모델에는 이제 내용으로 둘 이상의 자식 요소가 할당 될 수 있습니다.Therefore the apparent content model in the markup can now have more than one child element assigned as the content. 다음은 Panel 파생 된 클래스에 대 한 내용 구문입니다.The following is content syntax for a Panel derived class. 모든 Panel 파생 클래스는 XAML 콘텐츠 속성을 Children로 설정 합니다 .이 속성에는 형식의 UIElementCollection값이 필요 합니다.All Panel derived classes establish the XAML content property to be Children, which requires a value of type UIElementCollection.

<Page
  xmlns="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>

의 property 요소 Children 와의 요소 UIElementCollection 는 태그에 필요 하지 않습니다.Note that neither the property element for Children nor the element for the UIElementCollection is required in the markup. 이는 XAML의 디자인 기능으로,을 정의 하는 재귀적으로 UIUI 포함 된 요소가 중간 속성 요소 태그 없이 직계 부모-자식 요소 관계를 가진 중첩 된 요소의 트리로 보다 직관적으로 표현 됩니다. 컬렉션 개체입니다.This is a design feature of XAML so that recursively contained elements that define a UIUI are more intuitively represented as a tree of nested elements with immediate parent-child element relationships, without intervening property element tags or collection objects. 실제로는 UIElementCollection 의도적으로 태그에서 개체 요소로 명시적으로 지정할 수 없습니다.In fact, UIElementCollection cannot be specified explicitly in markup as an object element, by design. 유일 하 게 사용 되는 것은 암시적 컬렉션 UIElementCollection 이므로는 매개 변수가 없는 public 생성자를 노출 하지 않으므로 개체 요소로 인스턴스화할 수 없습니다.Because its only intended use is as an implicit collection, UIElementCollection does not expose a public parameterless constructor and thus cannot be instantiated as an object element.

콘텐츠 속성을 사용 하 여 개체에서 속성 요소 및 개체 요소 혼합Mixing Property Elements and Object Elements in an Object with a Content Property

Xaml 사양에서는 XAML 프로세서가 개체 요소 내에서 XAML 콘텐츠 속성을 채우는 데 사용 되는 개체 요소를 연속 해야 하며 혼합할 수 없도록 선언 합니다.The XAML specification declares that a XAML processor can enforce that object elements that are used to fill the XAML content property within an object element must be contiguous, and must not be mixed. 속성 요소와 콘텐츠를 혼합 하는 이러한 제한은 XAML 프로세서 WPFWPF 에 의해 적용 됩니다.This restriction against mixing property elements and content is enforced by the WPFWPF XAML processors.

자식 개체 요소를 개체 요소 내의 첫 번째 직접 태그로 사용할 수 있습니다.You can have a child object element as the first immediate markup within an object element. 그런 다음 속성 요소를 도입할 수 있습니다.Then you can introduce property elements. 또는 하나 이상의 속성 요소, 콘텐츠, 추가 속성 요소를 지정할 수 있습니다.Or, you can specify one or more property elements, then content, then more property elements. 그러나 속성 요소가 콘텐츠 뒤에 오면 추가 콘텐츠를 도입할 수 없으며 속성 요소만 추가할 수 있습니다.But once a property element follows content, you cannot introduce any further content, you can only add property elements.

이 내용/속성 요소 순서 요구 사항은 콘텐츠로 사용 되는 내부 텍스트에 적용 되지 않습니다.This content / property element order requirement does not apply to inner text used as content. 그러나 속성 요소가 내부 텍스트와 함께 사용 되는 경우 유효 공백은 태그에서 시각적으로 검색 하기가 어렵기 때문에 내부 텍스트를 연속 하 여 유지 하는 것은 여전히 좋은 태그 스타일입니다.However, it is still a good markup style to keep inner text contiguous, because significant white space will be difficult to detect visually in the markup if property elements are interspersed with inner text.

XAML 네임스페이스XAML Namespaces

이전 구문 예제에서 기본 XAML 네임 스페이스 이외의 XAML 네임 스페이스를 지정 하지 않았습니다.None of the preceding syntax examples specified a XAML namespace other than the default XAML namespace. 일반적인 WPFWPF 응용 프로그램에서 기본 XAML 네임 스페이스는 WPFWPF 네임 스페이스로 지정 됩니다.In typical WPFWPF applications, the default XAML namespace is specified to be the WPFWPF namespace. 기본 XAML 네임 스페이스 외에도 여전히 유사한 구문을 사용 하는 XAML 네임 스페이스를 지정할 수 있습니다.You can specify XAML namespaces other than the default XAML namespace and still use similar syntax. 그러나 기본 XAML 네임 스페이스 내에서 액세스할 수 없는 클래스 이름이 지정 된 위치에 있는 경우 해당 클래스 이름 앞에는 해당 CLR 네임 스페이스에 매핑된 XAML 네임 스페이스의 접두사가와 야 합니다.But then, anywhere where a class is named that is not accessible within the default XAML namespace, that class name must be preceded with the prefix of the XAML namespace as mapped to the corresponding CLR namespace. 예를 들어 <custom:Example/> ,는 Example 클래스의 인스턴스를 인스턴스화하는 개체 요소 구문입니다 .이 클래스는 해당 클래스를 포함 하는 CLR 네임 스페이스 (및 지원 형식을 포함 하는 외부 어셈블리 정보)가 이전에에 매핑 되었습니다. custom 접두사.For example, <custom:Example/> is object element syntax to instantiate an instance of the Example class, where the CLR namespace containing that class (and possibly the external assembly information that contains backing types) was previously mapped to the custom prefix.

XAML 네임 스페이스에 대 한 자세한 내용은 WPF xaml을 위한 Xaml 네임 스페이스 및 네임 스페이스 매핑을 참조 하세요.For more information about XAML namespaces, see XAML Namespaces and Namespace Mapping for WPF XAML.

태그 확장Markup Extensions

XAML은 문자열 특성 값 또는 개체 요소의 일반적인 XAML 프로세서 처리에서 이스케이프할 수 있도록 하 고 지원 클래스에 대 한 처리를 지연 하는 태그 확장 프로그래밍 엔터티를 정의 합니다.XAML defines a markup extension programming entity that enables an escape from the normal XAML processor handling of string attribute values or object elements, and defers the processing to a backing class. 특성 구문을 사용 하는 경우 XAML 프로세서에 대 한 태그 확장을 식별 하는 문자는 여는 중괄호 ({)와 닫는 중괄호 (}) 이외의 모든 문자를 나타냅니다.The character that identifies a markup extension to a XAML processor when using attribute syntax is the opening curly brace ({), followed by any character other than a closing curly brace (}). 여는 중괄호 뒤의 첫 번째 문자열은 특정 확장 동작을 제공 하는 클래스를 참조 해야 합니다 .이 경우에는 해당 하위 문자열이 진정한 클래스 이름의 일부인 경우 참조에서 하위 문자열 "Extension"을 생략할 수 있습니다.The first string following the opening curly brace must reference the class that provides the particular extension behavior, where the reference may omit the substring "Extension" if that substring is part of the true class name. 이후에는 단일 공간이 나타날 수 있으며, 그 다음에 나오는 각 문자는 닫는 중괄호가 나타날 때까지 확장 구현에서 입력으로 사용 됩니다.Thereafter, a single space may appear, and then each succeeding character is used as input by the extension implementation, up until the closing curly brace is encountered.

.Net XAML 구현에서는에서 MarkupExtension WPFWPF 지 원하는 모든 태그 확장의 기반으로 추상 클래스를 사용 하 고 다른 프레임 워크 또는 기술도 사용 합니다.The .NET XAML implementation uses the MarkupExtension abstract class as the basis for all of the markup extensions supported by WPFWPF as well as other frameworks or technologies. 특수 하 게 구현 WPFWPF 되는 태그 확장은 다른 기존 개체를 참조 하거나 런타임에 계산 될 개체에 대해 지연 된 참조를 만들 수 있는 수단을 제공 하기 위한 것입니다.The markup extensions that WPFWPF specifically implements are often intended to provide a means to reference other existing objects, or to make deferred references to objects that will be evaluated at run time. 예를 들어 특정 속성에 일반적으로 사용 되는 값 대신 {Binding} 태그 확장을 지정 하 여 간단한 WPF 데이터 바인딩을 수행 합니다.For example, a simple WPF data binding is accomplished by specifying the {Binding} markup extension in place of the value that a particular property would ordinarily take. 대부분의 WPF 태그 확장은 특성 구문이 가능 하지 않은 속성에 대 한 특성 구문을 사용 합니다.Many of the WPF markup extensions enable an attribute syntax for properties where an attribute syntax would not otherwise be possible. 예를 들어 개체 Style 는 중첩 된 일련의 개체 및 속성을 포함 하는 비교적 복잡 한 형식입니다.For example, a Style object is a relatively complex type that contains a nested series of objects and properties. Wpf의 스타일은 일반적으로의 ResourceDictionary리소스로 정의 된 다음 리소스를 요청 하는 두 개의 WPF 태그 확장 중 하나를 통해 참조 됩니다.Styles in WPF are typically defined as a resource in a ResourceDictionary, and then referenced through one of the two WPF markup extensions that request a resource. 태그 확장은 리소스 조회에 대 한 속성 값의 계산을 지연 하 고 다음 예제와 같이 특성 Style 구문을 사용 하 여 Style속성 값을 제공 합니다.The markup extension defers the evaluation of the property value to a resource lookup and enables providing the value of the Style property, taking type Style, in attribute syntax as in the following example:

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

여기서는 태그 확장 StaticResourceExtension 구현을 제공 하는 클래스를 식별합니다.StaticResourceHere, StaticResource identifies the StaticResourceExtension class providing the markup extension implementation. 다음 문자열 MyStyle 은 기본 StaticResourceExtension 이 아닌 생성자의 입력으로 사용 됩니다. 여기서 확장 문자열에서 가져온 매개 변수는 요청 ResourceKey된를 선언 합니다.The next string MyStyle is used as the input for the non-default StaticResourceExtension constructor, where the parameter as taken from the extension string declares the requested ResourceKey. MyStyle는 리소스로 Style 정의 된의 x:Key 값 이어야 합니다.MyStyle is expected to be the x:Key value of a Style defined as a resource. StaticResource 태그 확장 사용은 리소스를 로드 시 정적 리소스 조회 논리를 Style 통해 속성 값을 제공 하는 데 사용 하도록 요청 합니다.The StaticResource Markup Extension usage requests that the resource be used to provide the Style property value through static resource lookup logic at load time.

태그 확장에 대한 자세한 내용은 XAML 태그 확장 및 WPF XAML을 참조하세요.For more information about markup extensions, see Markup Extensions and WPF XAML. 일반 .net XAML 구현에서 사용 되는 태그 확장 및 기타 XAML 프로그래밍 기능에 대 한 참조는 xaml 네임 스페이스 (x:)를 참조 하세요. 언어 기능.For a reference of markup extensions and other XAML programming features enabled in the general .NET XAML implementation, see XAML Namespace (x:) Language Features. WPF 관련 태그 확장은 WPF XAML 확장을 참조 하세요.For WPF-specific markup extensions, see WPF XAML Extensions.

연결된 속성Attached Properties

연결 된 속성은 특정 형식에서 속성을 소유 하 고 정의할 수 있지만 모든 요소에서 특성 또는 속성 요소로 설정할 수 있는 XAML로 도입 된 프로그래밍 개념입니다.Attached properties are a programming concept introduced in XAML whereby properties can be owned and defined by a particular type, but set as attributes or property elements on any element. 연결 된 속성을 사용 하는 기본 시나리오는 모든 요소에 대해 광범위 한 공유 개체 모델을 요구 하지 않고도 태그 구조의 자식 요소가 부모 요소에 정보를 보고할 수 있도록 하는 것입니다.The primary scenario that attached properties are intended for is to enable child elements in a markup structure to report information to a parent element without requiring an extensively shared object model across all elements. 반대로, 연결 된 속성은 부모 요소에서 자식 요소에 대 한 정보를 보고 하는 데 사용할 수 있습니다.Conversely, attached properties can be used by parent elements to report information to child elements. 연결 된 속성의 목적과 연결 된 속성을 만드는 방법에 대 한 자세한 내용은 연결 된 속성 개요를 참조 하세요.For more information on the purpose of attached properties and how to create your own attached properties, see Attached Properties Overview.

연결 된 속성은 typeName도 지정 한다는 표면적 속성 요소 구문과 유사한 구문을 사용 합니다. propertyName 조합입니다.Attached properties use a syntax that superficially resembles property element syntax, in that you also specify a typeName.propertyName combination. 다음과 같은 두 가지 중요한 차이점이 있습니다.There are two important differences:

  • TypeName을 사용할 수 있습니다. 특성 구문을 통해 연결 된 속성을 설정 하는 경우에도 propertyName 조합이 가능 합니다.You can use the typeName.propertyName combination even when setting an attached property through attribute syntax. 연결 된 속성은 속성 이름을 정규화 하는 경우에만 특성 구문의 요구 사항입니다.Attached properties are the only case where qualifying the property name is a requirement in an attribute syntax.

  • 연결 된 속성에 대해 속성 요소 구문을 사용할 수도 있습니다.You can also use property element syntax for attached properties. 그러나 일반적인 속성 요소 구문의 경우 지정 하는 typeName 은 property 요소를 포함 하는 개체 요소입니다.However, for typical property element syntax, the typeName you specify is the object element that contains the property element. 연결 된 속성을 참조 하는 경우 typeName 은 포함 하는 개체 요소가 아니라 연결 된 속성을 정의 하는 클래스입니다.If you are referring to an attached property, then the typeName is the class that defines the attached property, not the containing object element.

연결된 이벤트Attached Events

연결 된 이벤트는 특정 형식으로 이벤트를 정의할 수 있지만 모든 개체 요소에 대 한 처리기가 연결 될 수 있는 XAML에서 도입 된 다른 프로그래밍 개념입니다.Attached events are another programming concept introduced in XAML where events can be defined by a specific type, but handlers may be attached on any object element. WOF 구현에서 연결 된 이벤트를 정의 하는 형식은 서비스를 정의 하는 정적 형식이 고, 경우에 따라 연결 된 이벤트는 서비스를 노출 하는 형식의 라우트된 이벤트 별칭에 의해 노출 됩니다.In the WOF implementation, often the type that defines an attached event is a static type that defines a service, and sometimes those attached events are exposed by a routed event alias in types that expose the service. 연결 된 이벤트에 대 한 처리기는 특성 구문을 통해 지정 됩니다.Handlers for attached events are specified through attribute syntax. 연결 된 이벤트와 마찬가지로 특성 구문은 연결 된 이벤트에 대해 확장 되어 typeName을 허용 합니다. eventname 사용. 여기서 typeName 은 연결 된 이벤트 인프라 AddRemove 대해 및 이벤트 처리기 접근자를 제공 하는 클래스이 고 eventName 은 이벤트 이름입니다.As with attached events, the attribute syntax is expanded for attached events to allow a typeName.eventName usage, where typeName is the class that provides Add and Remove event handler accessors for the attached event infrastructure, and eventName is the event name.

XAML 루트 요소 분석Anatomy of a XAML Root Element

다음 표에서는 일반적인 XAML 루트 요소를 세분화 하 여 루트 요소의 특정 특성을 보여 줍니다.The following table shows a typical XAML root element broken down, showing the specific attributes of a root element:

<Page Root 요소의 개체 요소를 여는 중Opening object element of the root element
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Default (WPFWPF) XAML 네임 스페이스The default (WPFWPF) XAML namespace
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" XAML 언어 XAML 네임 스페이스The XAML language XAML namespace
x:Class="ExampleNamespace.ExampleCode" Partial 클래스에 대해 정의 된 코드 숨김으로 태그를 연결 하는 partial 클래스 선언입니다.The partial class declaration that connects markup to any code-behind defined for the partial class
> 루트에 대 한 개체 요소의 끝입니다.End of object element for the root. 요소가 자식 요소를 포함 하기 때문에 개체가 아직 닫혀 있지 않습니다.Object is not closed yet because the element contains child elements

선택적 및 권장 되지 않는 XAML 용도Optional and Nonrecommended XAML Usages

다음 섹션에서는 xaml 프로세서에서 기술적으로 지원 되지만 xaml 소스를 포함 하는 응용 프로그램을 개발할 때 사용자가 읽을 수 있는 XAML 파일을 방해 하는 자세한 정보 표시 또는 기타 미적 문제를 생성 하는 XAML 사용에 대해 설명 합니다.The following sections describe XAML usages that are technically supported by XAML processors, but that produce verbosity or other aesthetic issues that interfere with XAML files remaining human-readable when you develop applications that contain XAML sources.

선택적 속성 요소 사용Optional Property Element Usages

선택적 속성 요소 사용에는 XAML 프로세서에서 암시적으로 고려 하는 요소 콘텐츠 속성을 명시적으로 작성 하는 작업이 포함 됩니다.Optional property element usages include explicitly writing out element content properties that the XAML processor considers implicit. 예를 들어의 Menu콘텐츠를 선언 하는 경우의 Items <Menu.Items> <Menu.Items> 컬렉션을 속성 요소 태그로 명시적으로 선언 하 고 Menu , 대신에 각 MenuItem 컬렉션을 삽입할 수 있습니다. 암시적 XAML 프로세서 동작을 사용 하는 것 보다의 Menu 모든 자식 요소가 이어야 하 MenuItem Items 고 컬렉션에 배치 되어야 합니다.For example, when you declare the contents of a Menu, you could choose to explicitly declare the Items collection of the Menu as a <Menu.Items> property element tag, and place each MenuItem within <Menu.Items>, rather than using the implicit XAML processor behavior that all child elements of a Menu must be a MenuItem and are placed in the Items collection. 경우에 따라 선택적 사용을 사용 하면 태그에 표시 된 개체 구조를 시각적으로 명확 하 게 파악할 수 있습니다.Sometimes the optional usages can help to visually clarify the object structure as represented in the markup. 또는 명시적 속성 요소를 사용 하는 경우에는 기술적으로 작동 하지만 시각적으로 혼동 되는 태그를 방지할 수 있습니다 (예: 특성 값 내 중첩 된 태그 확장).Or sometimes an explicit property element usage can avoid markup that is technically functional but visually confusing, such as nested markup extensions within an attribute value.

전체 typeName. memberName 정규화 된 특성Full typeName.memberName Qualified Attributes

형식 이름입니다. 특성에 대 한 memberName 폼은 실제로 라우트된 이벤트 사례 보다 훨씬 더 일반적으로 작동 합니다.The typeName.memberName form for an attribute actually works more universally than just the routed event case. 그러나 형식이 불필요 하 고 태그 스타일 및 가독성을 위해 필요한 경우에만이를 방지 해야 하는 경우도 있습니다.But in other situations that form is superfluous and you should avoid it, if only for reasons of markup style and readability. 다음 예제에서 Background 특성에 대 한 세 개의 참조는 모두 동일 합니다.In the following example, each of the three references to the Background attribute are completely equivalent:

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

Button.Background에서 Button 해당 속성에 대 한 정규화 된 조회가 성공 하 고Background Button (컨트롤에서 상속 됨) 개체 요소의 클래스 또는 기본 클래스 이기 때문에 작동 합니다.Button.Background works because the qualified lookup for that property on Button is successful (Background was inherited from Control) and Button is the class of the object element or a base class. Control.Background클래스는 Control 실제로을 정의 Background 하 고 Control Button 기본 클래스 이기 때문에 작동 합니다.Control.Background works because the Control class actually defines Background and Control is a Button base class.

그러나 다음 형식 이름입니다. memberName form 예제는 작동 하지 않으므로 주석으로 표시 됩니다.However, the following typeName.memberName form example does not work and is thus shown commented:

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

Label는의 Control다른 파생 클래스 이며, Label 개체 요소 내에서 Label.Background 를 지정한 경우이 사용이 정상적으로 작동 합니다.Label is another derived class of Control, and if you had specified Label.Background within a Label object element, this usage would have worked. 그러나는의 Button클래스 또는 기본 클래스가 아니므로 지정 된 XAML 프로세서 동작은를 연결 된 속성으로 처리 Label.Background 하는 것입니다. LabelHowever, because Label is not the class or base class of Button, the specified XAML processor behavior is to then process Label.Background as an attached property. Label.Background는 사용 가능한 연결 된 속성이 아니므로이 사용이 실패 합니다.Label.Background is not an available attached property, and this usage fails.

baseTypeName. memberName 속성 요소baseTypeName.memberName Property Elements

TypeName과 비슷한 방법으로 memberName Form은 basetypename특성 구문에 대해 작동 합니다. memberName 구문은 속성 요소 구문에 대해 작동 합니다.In an analogous way to how the typeName.memberName form works for attribute syntax, a baseTypeName.memberName syntax works for property element syntax. 예를 들어 다음 구문은 작동 합니다.For instance, the following syntax works:

<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>

여기서 property 요소는에 포함 되어 있는 Control.Background 경우에 Button도로 지정 되었습니다.Here, the property element was given as Control.Background even though the property element was contained in Button.

하지만 typeName과 동일 합니다. memberName 특성에 대 한 형식 basetypename. memberName 가 태그에서 잘못 된 스타일 이므로이를 방지 해야 합니다.But just like typeName.memberName form for attributes, baseTypeName.memberName is poor style in markup, and you should avoid it.

참고자료See also