XAML의 공백 처리
XAML의 언어 규칙에서는 XAML 프로세서 구현에서 유효한 공백을 반드시 처리하도록 합니다. 이 항목에서는 이러한 XAML 언어 규칙에 대해 설명합니다. 또한 XAML 프로세서와 serialization에 사용되는 XAML 작성기의 Windows Presentation Foundation (WPF) 구현에 의해 정의된 추가 공백 처리 방법에 대해 설명합니다.
이 항목에는 다음 단원이 포함되어 있습니다.
- 공백 정의
- 공백 정규화
- 내부 텍스트의 공백 및 문자열 기본 형식
- 공백 유지
- 동아시아 문자
- 공백 및 텍스트 콘텐츠 모델
- 관련 항목
공백 정의
XML에서와 마찬가지로 XAML의 공백 문자는 공백, 줄 바꿈 및 탭이며, 이러한 값은 각각 Unicode 값 0020, 000A 및 0009에 해당합니다.
공백 정규화
XAML 프로세서가 XAML 파일을 처리하면 기본적으로 공백이 다음과 같이 정규화됩니다.
동아시아 문자 사이의 줄 바꿈 문자가 제거됩니다. 동아시아 문자에 대한 정의는 이 항목 뒷부분의 "동아시아 문자" 단원을 참조하십시오.
모든 공백 문자(공백, 줄 바꿈, 탭)가 공백으로 변환됩니다.
연속되는 모든 공백이 삭제되고 단일 공백으로 바뀝니다.
시작 태그 바로 다음에 오는 공백이 삭제됩니다.
끝 태그 바로 앞에 오는 공백이 삭제됩니다.
여기서 "기본"이란 의미는 xml:space의 기본값이 나타내는 상태에 해당합니다.
내부 텍스트의 공백 및 문자열 기본 형식
앞의 정규화 규칙은 XAML 요소 내에 있는 내부 텍스트에 적용됩니다. 정규화를 수행한 이후 XAML 프로세서는 다음과 같이 모든 내부 텍스트를 적절한 형식으로 변환합니다.
속성이 컬렉션 형식이 아니고 직접적인 Object 형식이 아니면 XAML 프로세서는 형식 변환기를 사용하여 해당 형식으로 변환하려고 시도합니다. 변환이 실패하면 컴파일 타임 오류가 발생합니다.
속성이 컬렉션 형식이고 내부 텍스트가 연속적(중간에 요소 태그가 없음)이면 내부 텍스트가 단일 String으로 구문 분석됩니다. 컬렉션 형식에 String이 허용되지 않는 경우에도 컴파일 타임 오류가 발생합니다.
속성이 Object 형식이면 내부 텍스트가 단일 String으로 구문 분석됩니다. Object 형식은 String 등의 단일 개체를 나타내므로 중간에 요소 태그가 있으면 컴파일 타임 오류가 발생합니다.
속성이 컬렉션 형식이고 내부 텍스트가 연속적이지 않으면 첫 번째 부분 문자열이 String으로 변환되어 컬렉션 항목으로 추가되고, 중간 요소가 컬렉션 항목으로 추가된 다음, 마지막 부분 문자열(있는 경우)이 컬렉션에 세 번째 String 항목으로 추가됩니다.
공백 유지
나중에 XAML 프로세서 공백 정규화의 영향을 받지 않도록 여러 가지 방법으로 소스 XAML에 공백을 유지할 수 있습니다.
xml:space="preserve": 이 특성은 공백을 유지할 요소의 수준에서 지정합니다. 이 특성을 사용하면 코드 편집 응용 프로그램에서 요소를 한 눈에 이해하기 쉬운 중첩 구조로 "보기 좋게" 정렬하기 위해 추가하는 공백을 포함하여 모든 공백이 유지됩니다. 그러나 공백이 렌더링되는지 여부는 포함하는 요소의 콘텐츠 모델에 따라 달라집니다. 대부분의 개체 모델에서는 xml:space="preserve"의 설정에 관계없이 공백이 중요한 항목으로 간주되지 않으므로 이 특성은 루트 수준에서 지정하지 않는 것이 좋습니다. 일부 구현에서는 xml:space를 전역적으로 설정할 경우 XAML 처리(특히 serialization)의 성능에 영향이 있을 수 있습니다. 이 특성은 문자열 내의 공백을 렌더링하는 요소 또는 유효한 공백 컬렉션인 요소의 수준에서만 설정하는 것이 좋습니다.
엔터티 및 줄 바꿈하지 않는 공백: XAML에서는 텍스트 개체 모델 내에 Unicode 엔터티를 삽입할 수 있습니다. 줄 바꿈하지 않는 공백(UTF-8 인코딩의 경우  )과 같은 전용 엔터티를 사용하거나, 줄 바꿈하지 않는 공백 문자를 지원하는 서식 있는 텍스트 컨트롤을 사용할 수도 있습니다. 엔터티의 런타임 출력은 패널 및 여백을 올바르게 사용할 때처럼 일반적인 레이아웃 시스템에서 들여쓰기를 적용하는 기능을 사용할 때보다 더 많은 요인의 영향을 받을 수 있기 때문에 엔터티를 사용하여 들여쓰기 같은 레이아웃 특성을 시뮬레이션할 때는 주의해야 합니다. 예를 들어 엔터티는 글꼴에 매핑되므로 선택한 글꼴에 따라 크기가 달라질 수 있습니다.
동아시아 문자
"동아시아 문자"는 U+20000 - U+2FFFD 및 U+30000 - U+3FFFD 범위의 Unicode 문자 집합으로 정의되며 이 하위 집합을 "CJK ideographs"라고도 합니다. 자세한 내용은 http://www.unicode.org를 참조하십시오.
공백 및 텍스트 콘텐츠 모델
실제로 공백 유지 문제는 사용할 수 있는 모든 콘텐츠 모델 중 일부에서만 문제가 됩니다. 특정 폼에서 singleton String 형식을 사용하거나, 전용 String 컬렉션을 사용하거나, IList 또는 ICollection<T> 컬렉션에서 String과 다른 형식을 혼합하여 사용할 수 있는 콘텐츠 모델이 이에 해당합니다.
WPF의 공백 및 텍스트 콘텐츠 모델
이 단원의 나머지 부분에서는 WPF에 의해 정의된 특정 형식을 참조합니다. 이 항목에 설명된 공백 처리 기능은 일반적으로 .NET Framework XAML 서비스와 WPF 모두에 관련이 있습니다. 이 동작을 실제로 보려는 경우 일부 WPF XAML 태그를 시험해 보고 개체 그래프에서 결과를 본 다음 다시 태그로 serialize할 수 있습니다.
이러한 콘텐츠 모델은 문자열을 사용할 수 있는 경우에도 기본적으로 남아 있는 공백을 유효한 문자로 처리하지 않습니다. 예를 들어 ListBox는 IList를 사용하지만 각 ListBoxItem 사이의 줄 바꿈과 같은 공백은 유지되지 않으며 렌더링되지도 않습니다. 줄 바꿈을 ListBoxItem 항목의 문자열 간 구분 기호로 사용하려고 해도 줄 바꿈으로 구분된 문자열은 단일 문자열 및 단일 항목으로 처리되기 때문에 구분 기호 역할을 하지 못하게 됩니다.
유동 문서 모델의 일부인 컬렉션에서 주로 공백을 유효하게 처리합니다. 공백 유지 동작을 지원하는 주요 컬렉션은 InlineCollection으로, 이 컬렉션 클래스는 WhitespaceSignificantCollectionAttribute로 선언됩니다. 이 특성이 있으면 XAML 프로세서는 컬렉션 내의 공백을 유효한 공백으로 처리합니다. 컬렉션의 WhitespaceSignificantCollectionAttribute에 xml:space="preserve"와 공백을 조합하면 모든 공백이 유지되고 렌더링됩니다. WhitespaceSignificantCollectionAttribute에 xml:space="default"와 공백을 조합하면 앞에서 설명한 초기 공백 정규화가 수행되어 특정 위치의 단일 공백만 남겨지며 이러한 공백만 유지되고 렌더링됩니다. 어느 동작을 사용할지는 사용자가 선택해야 하며, 필요한 경우 xml:space를 사용하여 원하는 동작이 가능하도록 설정해야 합니다.
유동 문서 모델에서 줄 바꿈을 나타내는 특정 인라인 요소는 유효한 공백 컬렉션인 경우에도 공백을 추가하면 안 됩니다. 예를 들어 LineBreak 요소는 HTML의 <BR/> 태그와 같은 역할을 하며, 태그를 읽기 쉽도록 LineBreak와 그 다음에 나오는 텍스트는 대개 줄 바꿈을 작성하여 구분합니다. 이 줄 바꿈은 다음 줄의 선행 공백으로 정규화되지 않습니다. 이 동작을 구현하려면 LineBreak 요소의 클래스 정의에서 TrimSurroundingWhitespaceAttribute를 적용합니다. XAML 프로세서는 이 특성을 LineBreak 앞/뒤의 공백을 항상 트리밍하라는 의미로 해석합니다.