WPF에서는 이러한 요소를 지원하는 개체의 속성을 설정하여 UI 요소에 콘텐츠를 추가합니다. 예를 들어, ListBox 컨트롤에 항목을 추가할 때는 해당 Items 속성을 조작합니다. 이렇게 하면 Items 속성 값인 ItemCollection에 항목이 배치됩니다. 마찬가지로, DockPanel에 개체를 추가하려면 해당 Children 속성 값을 조작합니다. 이때는 UIElementCollection에 개체를 추가하게 됩니다. 코드 예제를 보려면 방법: 동적으로 요소 추가를 참조하십시오.
Extensible Application Markup Language (XAML)에서 ListBox의 목록 항목, 컨트롤 또는 다른 UI 요소를 DockPanel에 배치할 때는 다음 예제와 같이 명시적 또는 암시적으로 Items 및 Children 속성도 사용합니다.
<DockPanel
Name="ParentElement"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<!--implicit: <DockPanel.Children>-->
<ListBox DockPanel.Dock="Top">
<!--implicit: <ListBox.Items>-->
<ListBoxItem>
<TextBlock>Dog</TextBlock>
</ListBoxItem>
<ListBoxItem>
<TextBlock>Cat</TextBlock>
</ListBoxItem>
<ListBoxItem>
<TextBlock>Fish</TextBlock>
</ListBoxItem>
<!--implicit: </ListBox.Items>-->
</ListBox>
<Button Height="20" Width="100" DockPanel.Dock="Top">Buy a Pet</Button>
<!--implicit: </DockPanel.Children>-->
</DockPanel>
문서 개체 모델에서 이 XAML을 XML로 처리하려고 했으며, 적합했을 동작이지만 암시적으로 주석 처리된 태그를 포함했다면 결과로 생성된 XML DOM 트리에 <ListBox.Items> 및 다른 암시적 항목에 대한 요소가 포함되었을 것입니다. 그러나 XAML에서는 태그를 읽고 개체에 쓸 때 이런 방식으로 처리되지 않으며, 결과로 생성된 개체 그래프에 ListBox.Items가 포함되지 않습니다. 그러나 ItemCollection이 포함된 Items라는 ListBox 속성이 있으며, ListBox XAML을 처리할 때는 이 ItemCollection이 초기화되었지만 비어 있습니다. 그런 후에 ListBox의 콘텐츠로 존재하는 각 자식 개체 요소가 ItemCollection.Add에 대한 파서 호출을 통해 ItemCollection에 추가됩니다. 지금까지는 XAML을 개체 트리로 처리하는 이 예제가 기본적으로 논리적 트리인 개체 트리를 만드는 예제처럼 보입니다.
그러나 XAML 암시적 구문 항목을 제외하더라도 논리적 트리는 런타임에 응용 프로그램 UI에 대해 존재하는 전체 개체 그래프가 아닙니다. 이것은 주로 시각 효과와 템플릿 때문입니다. 예를 들어, Button을 고려해 보겠습니다. 논리적 트리는 Button 개체 및 이 개체의 문자열 Content를 보고합니다. 그러나 런타임 개체 트리에서는 이 단추에 그 밖의 특성이 있습니다. 특히, 특정 Button 컨트롤 템플릿이 적용되었기 때문에 이 단추는 기본 모양으로만 화면에 나타납니다. 적용된 템플릿(예: 시각적 단추 주위에 있는 진한 회색의 템플릿 정의 Border)에서 제공된 시각 효과는 표시되는 UI의 입력 이벤트를 처리한 후 논리적 트리를 읽는 경우처럼 런타임에 논리적 트리를 보는 경우에도 논리적 트리에 보고되지 않습니다. 템플릿 시각 효과를 찾으려면 대신 시각적 트리를 검사해야 합니다.
XAML 구문이 만들어진 개체 그래프에 매핑되는 방법 및 XAML의 암시적 구문에 대한 자세한 내용은 XAML 구문 정보 또는 XAML 개요(WPF)를 참조하십시오.
논리적 트리의 용도
논리적 트리는 콘텐츠 모델이 해당 자식 개체에서 쉽게 반복될 수 있도록 하고 콘텐츠 모델을 확장할 수 있도록 하는 역할을 합니다. 또한 논리적 트리는 논리적 트리의 모든 개체가 로드되었을 때와 같은 특정 알림을 위한 프레임워크를 제공합니다. 기본적으로 논리적 트리는 런타임 개체 그래프의 프레임워크 수준 근사값으로, 시각 효과를 제외하지만 고유한 런타임 응용 프로그램의 컴퍼지션에 대한 대부분의 쿼리 작업에 적합합니다.
또한 초기 요청 개체의 Resources 컬렉션에 대한 논리적 트리에서 위쪽을 살펴본 후 논리적 트리를 올라가면서 해당 키를 포함할 수 있는 ResourceDictionary가 포함된 다른 Resources 값에 대해 각 FrameworkElement(또는 FrameworkContentElement)를 검사하여 정적 및 동적 리소스 참조를 모두 확인합니다. 논리적 트리와 시각적 트리가 모두 있는 경우 리소스 조회 시 논리적 트리가 사용됩니다. 리소스 사전 및 조회에 대한 자세한 내용은 리소스 개요를 참조하십시오.
논리적 트리의 컴퍼지션
논리적 트리 재정의
고급 컨트롤 작성자는 일반 개체 또는 콘텐츠 모델이 논리적 트리 내에서 개체를 추가하거나 제거하는 방법을 정의하는 몇 가지 APIs를 재정의하여 논리적 트리를 재정의할 수 있습니다. 논리적 트리를 재정의하는 방법을 보여 주는 예제는 방법: 논리 트리 재정의를 참조하십시오.
속성 값 상속
속성 값 상속은 혼합 트리를 통해 작동합니다. 속성 상속을 가능하게 하는 Inherits 속성을 포함하는 실제 메타데이터는 WPF 프레임워크 수준 FrameworkPropertyMetadata 클래스입니다. 따라서 원래 값을 보유하는 부모와 해당 값을 상속하는 자식 개체는 모두 FrameworkElement 또는 FrameworkContentElement여야 하고 논리적 트리의 일부여야 합니다. 하지만 속성 상속을 지원하는 기존 WPF 속성의 경우 속성 값 상속이 논리적 트리에 없는 중간 개체에도 적용될 수 있습니다. 이 기능은 주로 템플릿 요소가 템플릿을 기반으로 하는 인스턴스에 설정되었거나 페이지 수준 컴퍼지션의 상위 수준에 있어 논리적 트리에서도 상위 수준에 있는 상속된 속성 값을 사용하도록 하는 데 적합합니다. 이러한 경계에서 속성 값이 일관되게 상속되려면 상속 속성이 연결된 속성으로 등록되어 있어야 하며, 속성 상속 동작이 있는 사용자 지정 종속성 속성을 정의하려는 경우 이 패턴을 따라야 합니다. 속성 상속에 사용되는 트리가 어떤 것인지는 도우미 클래스 유틸리티 메서드가 정확하게 예상할 수 없으며 이는 런타임에도 마찬가지입니다. 자세한 내용은 속성 값 상속을 참조하십시오.