Share via


XAML의 공백 처리

업데이트: 2007년 11월

XAML(Extensible Application Markup Language)에는 XAML 프로세서 구현에서 유효한 공백을 처리하는 방법을 정의하는 언어 규칙이 있습니다. 이 항목에서는 이러한 언어 규칙을 비롯하여 XAML 프로세서의 WPF(Windows Presentation Foundation) 구현에서 정의된 다른 공백 처리 방법 및 serialization에 사용되는 XAML 작성기에 대해 설명합니다.

공백 처리

공백 정의

XML에서와 마찬가지로 XAML의 공백 문자는 공백, 줄 바꿈 및 탭이며, 이러한 값은 각각 유니코드 값 0020, 000A 및 0009에 해당합니다.

공백 정규화

XAML 프로세서가 XAML 파일을 처리하면 기본적으로 공백이 다음과 같이 정규화됩니다.

  1. 동아시아 문자 사이의 줄 바꿈 문자가 제거됩니다. "동아시아 문자"에 대한 정의는 이 항목 아래쪽의 동아시아 문자 단원을 참조하십시오.

  2. 모든 공백 문자(공백, 줄 바꿈, 탭)가 공백으로 변환됩니다.

  3. 연속되는 모든 공백이 삭제되고 단일 공백으로 바뀝니다.

  4. 시작 태그 바로 다음에 오는 공백이 삭제됩니다.

  5. 끝 태그 바로 앞에 오는 공백이 삭제됩니다.

여기서 "기본"이란 의미는 xml:space의 기본값이 나타내는 상태에 해당합니다.

내부 텍스트의 공백 및 문자열 기본 형식

위의 정규화 규칙은 XAML 요소의 내부 텍스트에 적용됩니다. 정규화를 수행한 이후 XAML 프로세서는 다음과 같이 모든 내부 텍스트를 적절한 형식으로 변환합니다.

  • 속성이 컬렉션 형식이 아닌 경우 Object 형식이 아니면 XAML 프로세서는 형식 변환기를 통해 해당 형식으로 변환하려고 시도합니다. 변환이 실패하면 컴파일 타임 오류가 발생합니다.

  • 속성이 컬렉션 형식이고 내부 텍스트가 연속적(중간에 요소 태그가 없음)이면 내부 텍스트가 단일 String으로 구문 분석됩니다. 컬렉션 형식에 String이 허용되지 않는 경우에는 컴파일 타임 오류가 발생합니다.

  • 속성이 Object 형식이면 내부 텍스트가 단일 String으로 구문 분석됩니다. Object 형식은 String 등의 단일 개체를 나타내므로 중간에 요소 태그가 있으면 컴파일 타임 오류가 발생합니다.

  • 속성이 컬렉션 형식이고 내부 텍스트가 연속적이지 않으면 첫 번째 부분 문자열이 String으로 변환되어 컬렉션 항목으로 추가되고, 중간 요소가 컬렉션 항목으로 추가된 다음 마지막 부분 문자열(있는 경우)이 컬렉션에 세 번째 String 항목으로 추가됩니다.

공백 및 텍스트 콘텐츠 모델

실제로 공백 유지 문제는 사용할 수 있는 모든 콘텐츠 모델 중 일부에서만 문제가 됩니다. 특정 폼에서 singleton String 형식을 사용하거나, 전용 String 컬렉션을 사용하거나, IList 또는 ICollection<T> 컬렉션에서 String과 다른 형식을 혼합하여 사용할 수 있는 콘텐츠 모델이 이에 해당합니다.

이러한 콘텐츠 모델은 문자열을 사용할 수 있는 경우에도 기본적으로 남아 있는 공백을 유효한 문자로 처리하지 않습니다. 예를 들어 ListBoxIList를 사용하지만 공백(예: 각 ListBoxItem 사이의 줄 바꿈)이 유지되거나 렌더링되지 않습니다. 실제로 줄 바꿈을 ListBoxItem 항목의 문자열 사이의 구분 기호로 사용해도 이렇게 줄 바꿈으로 구분된 문자열은 단일 항목의 단일 문자열로 처리되기 때문에 구분 기호가 소용 없습니다.

유동 문서 모델의 일부인 컬렉션에서 주로 공백을 유효하게 처리합니다. 공백 유지 동작을 지원하는 주요 컬렉션은 InlineCollection으로, 이 컬렉션 클래스는 WhitespaceSignificantCollectionAttribute로 선언됩니다. 이 특성이 있으면 XAML 프로세서는 컬렉션 내의 공백을 유효한 공백으로 처리합니다. 컬렉션의 WhitespaceSignificantCollectionAttribute에 xml:space="preserve"와 공백을 조합하면 모든 공백이 유지되고 렌더링됩니다. WhitespaceSignificantCollectionAttribute에 xml:space="default"와 공백을 조합하면 앞에서 설명한 초기 공백 정규화가 수행되어 특정 위치의 단일 공백만 남겨지고 이러한 공백만 유지되고 렌더링됩니다. 어느 동작을 사용할지는 사용자가 선택해야 하며, 필요한 경우 xml:space를 사용하여 원하는 동작이 가능하도록 설정해야 합니다.

유동 문서 모델에서 줄 바꿈을 나타내는 특정 인라인 요소는 유효한 공백 컬렉션인 경우에도 공백을 추가하면 안 됩니다. 예를 들어 LineBreak 요소는 HTML의 <BR/> 태그와 같은 역할을 하며, 태그를 읽기 쉽도록 LineBreak와 그 다음에 나오는 텍스트는 대개 줄 바꿈을 작성하여 구분합니다. 이 줄 바꿈은 다음 줄의 선행 공백으로 정규화되지 않습니다. 이 동작을 구현하려면 LineBreak 요소의 클래스 정의에서 TrimSurroundingWhitespaceAttribute를 적용합니다. XAML 프로세서는 이 특성을 LineBreak 앞/뒤의 공백을 항상 트리밍하라는 의미로 해석합니다.

공백 유지

나중에 XAML 프로세서 공백 정규화의 영향을 받지 않도록 여러 가지 방법으로 소스 XAML에 공백을 유지할 수 있습니다.

xml:space="preserve": 이 특성은 공백을 유지할 요소의 수준에서 지정합니다. 이 특성을 사용하면 코드 편집 응용 프로그램에서 요소를 한 눈에 이해하기 쉬운 중첩 구조로 "보기 좋게" 정렬하기 위해 추가하는 공백을 포함하여 모든 공백이 유지됩니다. 그러나 공백이 렌더링되는지 여부는 포함하는 요소의 콘텐츠 모델에 따라 달라집니다. 대부분의 개체 모델에서는 공백이 중요한 항목으로 인식되지 않기 때문에 xml:space="preserve"를 루트 수준에서 지정하지 않는 것이 좋습니다. 이 특성은 문자열 내의 공백을 렌더링하는 요소 또는 유효한 공백 컬렉션인 요소의 수준에서만 설정하는 것이 좋습니다.

엔터티 및 줄 바꿈하지 않는 공백: XAML에서는 텍스트 개체 모델 내에 유니코드 엔터티를 삽입할 수 있습니다. 줄 바꿈하지 않는 공백(UTF-8 인코딩의 경우 &#160)과 같은 전용 엔터티를 사용하거나, 줄 바꿈하지 않는 공백 문자를 지원하는 서식 있는 텍스트 컨트롤을 사용할 수도 있습니다. 엔터티의 런타임 출력은 패널과 여백을 제대로 사용했는지 여부와 같은 일반적인 레이아웃 기능에 비해 더 많은 요인의 영향을 받을 수 있기 때문에 엔터티를 사용하여 들여쓰기 같은 레이아웃 특성을 시뮬레이션할 때는 주의해야 합니다. 예를 들어 엔터티는 글꼴에 매핑되므로 선택한 글꼴에 따라 크기가 달라질 수 있습니다.

동아시아 문자

"동아시아 문자"는 U+20000 - U+2FFFD 및 U+30000 - U+3FFFD 범위의 유니코드 문자 집합으로 정의되며 이 하위 집합을 "CJK ideographs"라고도 합니다. 자세한 내용은 http://www.unicode.org를 참조하십시오.

참고 항목

개념

XAML 개요

참조

XML 문자 엔터티 및 XAML

XAML의 xml:space 처리