XAML의 공백 처리

XAML의 언어 규칙에서는 XAML 프로세서 구현에서 유효한 공백을 반드시 처리하도록 합니다. 이 항목에서는 이러한 XAML 언어 규칙에 대해 설명합니다. 또한 XAML 프로세서와 serialization에 사용되는 XAML 작성기의 Windows Presentation Foundation (WPF) 구현에 의해 정의된 추가 공백 처리 방법에 대해 설명합니다.

이 항목에는 다음 단원이 포함되어 있습니다.

  • 공백 정의
  • 공백 정규화
  • 내부 텍스트의 공백 및 문자열 기본 형식
  • 공백 유지
  • 동아시아 문자
  • 공백 및 텍스트 콘텐츠 모델
  • 관련 항목

공백 정의

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

공백 정규화

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

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

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

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

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

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

여기서 "기본"이란 의미는 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 인코딩의 경우 &#160)과 같은 전용 엔터티를 사용하거나, 줄 바꿈하지 않는 공백 문자를 지원하는 서식 있는 텍스트 컨트롤을 사용할 수도 있습니다. 엔터티의 런타임 출력은 패널 및 여백을 올바르게 사용할 때처럼 일반적인 레이아웃 시스템에서 들여쓰기를 적용하는 기능을 사용할 때보다 더 많은 요인의 영향을 받을 수 있기 때문에 엔터티를 사용하여 들여쓰기 같은 레이아웃 특성을 시뮬레이션할 때는 주의해야 합니다. 예를 들어 엔터티는 글꼴에 매핑되므로 선택한 글꼴에 따라 크기가 달라질 수 있습니다.

동아시아 문자

"동아시아 문자"는 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할 수 있습니다.

이러한 콘텐츠 모델은 문자열을 사용할 수 있는 경우에도 기본적으로 남아 있는 공백을 유효한 문자로 처리하지 않습니다. 예를 들어 ListBoxIList를 사용하지만 각 ListBoxItem 사이의 줄 바꿈과 같은 공백은 유지되지 않으며 렌더링되지도 않습니다. 줄 바꿈을 ListBoxItem 항목의 문자열 간 구분 기호로 사용하려고 해도 줄 바꿈으로 구분된 문자열은 단일 문자열 및 단일 항목으로 처리되기 때문에 구분 기호 역할을 하지 못하게 됩니다.

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

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

참고 항목

참조

XML 문자 엔터티 및 XAML

XAML의 xml:space 처리

개념

XAML 개요(WPF)