WPF의 트리Trees in WPF

대부분의 기술에서 요소와 구성 요소는 트리 구조로 구성됩니다. 이 트리 구조에서 개발자는 트리의 개체 노드를 직접 조작하여 애플리케이션의 동작이나 렌더링에 영향을 줍니다.In many technologies, elements and components are organized in a tree structure where developers directly manipulate the object nodes in the tree to affect the rendering or behavior of an application. WPF(Windows Presentation Foundation)Windows Presentation Foundation (WPF)에서도 여러 가지 트리 구조 메타포를 사용하여 프로그램 요소 간의 관계를 정의합니다.also uses several tree structure metaphors to define relationships between program elements. 대부분 경우 WPF 개발자는 개념적으로 개체 트리 메타포를 고려하면서 코드로 애플리케이션을 만들거나 XAML로 애플리케이션의 일부를 정의할 수 있지만 XML DOM에서 사용할 수 있는 몇 가지 일반적인 개체 트리 조작 API 대신 특정 API를 호출하거나 특정 태그를 사용하여 이 작업을 수행합니다.For the most part WPF developers can create an application in code or define portions of the application in XAML while thinking conceptually about the object tree metaphor, but will be calling specific API or using specific markup to do so rather than some general object tree manipulation API such as you might use in XML DOM. WPF는 트리 메타포 뷰, LogicalTreeHelperVisualTreeHelper를 제공 하는 두 개의 도우미 클래스를 노출 합니다.WPF exposes two helper classes that provide a tree metaphor view, LogicalTreeHelper and VisualTreeHelper. 또한 WPF 설명서에서는 시각적 트리와 논리 트리라는 용어를 사용하는데 이러한 동일한 트리는 특정 주요 WPF 기능의 동작을 이해하는 데 유용하기 때문입니다.The terms visual tree and logical tree are also used in the WPF documentation because these same trees are useful for understanding the behavior of certain key WPF features. 이 항목에서는 시각적 트리와 논리적 트리가 나타내는 항목을 정의 하 고, 이러한 트리가 전반적인 개체 트리 개념과 어떻게 관련 되는지를 설명 하 고, LogicalTreeHelperVisualTreeHelper를 소개 합니다.This topic defines what the visual tree and logical tree represent, discusses how such trees relate to an overall object tree concept, and introduces LogicalTreeHelper and VisualTreeHelpers.

WPF의 트리Trees in WPF

WPFWPF에서 가장 완벽한 트리 구조는 개체 트리입니다.The most complete tree structure in WPFWPF is the object tree. XAMLXAML에서 애플리케이션 페이지를 정의한 후 XAMLXAML을 로드하는 경우 트리 구조는 태그에 있는 요소의 중첩 관계에 따라 만들어집니다.If you define an application page in XAMLXAML and then load the XAMLXAML, the tree structure is created based on the nesting relationships of the elements in the markup. 코드에서 애플리케이션이나 애플리케이션 일부를 정의하는 경우 트리 구조는 지정된 개체에 대한 콘텐츠 모델을 구현하는 속성에 대해 속성 값을 할당하는 방법에 따라 만들어집니다.If you define an application or a portion of the application in code, then the tree structure is created based on how you assign property values for properties that implement the content model for a given object. WPF(Windows Presentation Foundation)Windows Presentation Foundation (WPF)에서 완벽한 트리 구조는 논리 트리와 시각적 트리라는 두 가지 방법으로 개념화하고 공용 API에 보고할 수 있습니다.In WPF(Windows Presentation Foundation)Windows Presentation Foundation (WPF), there are two ways that the complete object tree is conceptualized and can be reported to its public API: as the logical tree and as the visual tree. 논리 트리와 시각적 트리의 구분이 항상 반드시 중요한 것은 아니지만 경우에 따라 특정 WPFWPF 하위 시스템에서 문제를 발생시키고 태그나 코드에서 선택하는 항목에 영향을 줄 수 있습니다.The distinctions between logical tree and visual tree are not always necessarily important, but they can occasionally cause issues with certain WPFWPF subsystems and affect choices you make in markup or code.

항상 논리 트리나 시각적 트리를 직접 조작하지 않는 경우에도 트리가 상호 작용하는 방식에 대한 개념을 이해하면 WPF를 기술로 이해하는 데 도움이 됩니다.Even though you do not always manipulate either the logical tree or the visual tree directly, understanding the concepts of how the trees interact is useful for understanding WPF as a technology. 또한 WPF를 일종의 트리 메타포로 생각하는 것은 WPFWPF에서 속성 상속 및 이벤트 라우팅의 작동 방식을 이해하는 데 매우 중요합니다.Thinking of WPF as a tree metaphor of some kind is also crucial to understanding how property inheritance and event routing work in WPFWPF.

참고

개체 트리는 실제 API라기보다는 일종의 개념이기 때문에 이 개념을 개체 그래프로 생각할 수도 있습니다.Because the object tree is more of a concept than an actual API, another way to think of the concept is as an object graph. 실제로 트리 메타포가 분류되는 런타임에 개체 간에 관계가 있습니다.In practice, there are relationships between objects at run time where the tree metaphor will break down. 그러나 특히 XAML 정의 UI를 사용하는 경우 트리 메타포는 대부분의 WPF 설명서에서 이 일반적인 개념을 참조할 때 개체 트리라는 용어를 사용할 정도로 충분히 관련이 있습니다.Nevertheless, particularly with XAML-defined UI, the tree metaphor is relevant enough that most WPF documentation will use the term object tree when referencing this general concept.

논리 트리The Logical Tree

WPFWPF에서는 해당 요소를 지원하는 개체의 속성을 설정하여 UI 요소에 콘텐츠를 추가합니다.In WPFWPF, you add content to UI elements by setting properties of the objects that back those elements. 예를 들어 Items 속성을 조작 하 여 ListBox 컨트롤에 항목을 추가 합니다.For example, you add items to a ListBox control by manipulating its Items property. 이렇게 하면 Items 속성 값인 ItemCollection에 항목이 배치 됩니다.By doing this, you are placing items into the ItemCollection that is the Items property value. 마찬가지로 DockPanel에 개체를 추가 하려면 Children 속성 값을 조작 합니다.Similarly, to add objects to a DockPanel, you manipulate its Children property value. 여기에서 UIElementCollection개체를 추가 합니다.Here, you are adding objects to the UIElementCollection. 코드 예제는 방법: 동적으로 요소 추가를 참조 하세요.For a code example, see How to: Add an Element Dynamically.

XAML(Extensible Application Markup Language)Extensible Application Markup Language (XAML)에서 목록 항목을 DockPanelListBox 또는 컨트롤이 나 기타 UI 요소에 배치한 경우 다음 예제와 같이 명시적 또는 암시적으로 ItemsChildren 속성을 사용 합니다.In XAML(Extensible Application Markup Language)Extensible Application Markup Language (XAML), when you place list items in a ListBox or controls or other UI elements in a DockPanel, you also use the Items and Children properties, either explicitly or implicitly, as in the following example.

<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>에 대한 요소 및 기타 암시적 항목이 포함됩니다.If you were to process this XAML as XML under a document object model, and if you had included the tags commented out as implicit (which would have been legal), then the resulting XML DOM tree would have included elements for <ListBox.Items> and the other implicit items. 그러나 XAML은 태그를 읽고 개체에 쓸 때 이런 방식으로 처리하지 않으며 결과 개체 그래프에 ListBox.Items가 포함되지 않습니다.But XAML does not process that way when you read the markup and write to objects, the resulting object graph does not literally include ListBox.Items. 그러나이 파일에는 ItemCollection를 포함 하는 Items 라는 ListBox 속성이 있지만 ListBox XAML이 처리 될 때 ItemCollection는 초기화 되지 않습니다.It does however have a ListBox property named Items that contains a ItemCollection, and that ItemCollection is initialized but empty when the ListBox XAML is processed. 그런 다음 ListBox의 콘텐츠로 존재 하는 각 자식 개체 요소는 ItemCollection.Add에 대 한 파서 호출을 통해 ItemCollection에 추가 됩니다.Then, each child object element that exists as content for the ListBox is added to the ItemCollection by parser calls to ItemCollection.Add. 지금까지 XAML을 개체 트리로 처리하는 이 예제는 생성된 개체 트리가 기본적으로 논리 트리인 경우로 보입니다.This example of processing XAML into an object tree is so far seemingly an example where the created object tree is basically the logical tree.

그러나 논리적 트리는 XAML 암시적 구문 항목이 제외 된 경우에도 런타임에 응용 프로그램 UI에 대해 존재 하는 전체 개체 그래프가 아닙니다. 주요 이유는 시각적 개체 및 템플릿입니다.However, the logical tree is not the entire object graph that exists for your application UI at run time, even with the XAML implicit syntax items factored out. The main reason for this is visuals and templates. 예를 들어 Button을 고려 합니다.For example, consider the Button. 논리적 트리는 Button 개체 및 해당 문자열 Content보고 합니다.The logical tree reports the Button object and also its string Content. 하지만 런타임 개체 트리의 이 단추에는 더 많은 정보가 있습니다.But there is more to this button in the run-time object tree. 특히 단추는 특정 Button 컨트롤 템플릿이 적용 되었기 때문에 화면에 표시 되는 방식에만 표시 됩니다.In particular, the button only appears on screen the way it does because a specific Button control template was applied. 런타임에 논리 트리를 확인 하는 경우에도 적용 된 템플릿에서 가져온 시각적 개체 (예: 시각적 단추 주위의 진한 회색의 템플릿 정의 Border)는 논리적 트리에서 보고 되지 않습니다. 표시 되는 UI를 찾은 다음 논리 트리를 읽습니다.The visuals that come from an applied template (such as the template-defined Border of dark gray around the visual button) are not reported in the logical tree, even if you are looking at the logical tree during run time (such as handling an input event from the visible UI and then reading the logical tree). 템플릿 시각 효과를 찾으려면 시각적 트리를 대신 검사해야 합니다.To find the template visuals, you would instead need to examine the visual tree.

XAMLXAML 구문이 생성된 개체 그래프에 매핑되는 방법 및 XAML의 암시적 구문에 대한 자세한 내용은 XAML 구문 정보 또는 XAML 개요(WPF)를 참조하세요.For more information about how XAMLXAML syntax maps to the created object graph, and implicit syntax in XAML, see XAML Syntax In Detail or XAML Overview (WPF).

논리 트리의 용도The Purpose of the Logical Tree

논리 트리를 통해 콘텐츠 모델은 해당 자식 개체를 쉽게 반복할 수 있고 콘텐츠 모델을 확장할 수 있습니다.The logical tree exists so that content models can readily iterate over their possible child objects, and so that content models can be extensible. 또한 논리 트리는 논리 트리의 모든 개체가 로드된 경우 등의 특정 알림에 대한 프레임워크를 제공합니다.Also, the logical tree provides a framework for certain notifications, such as when all objects in the logical tree are loaded. 기본적으로 논리 트리는 시각 효과를 제외한 프레임워크 수준의 런타임 개체 그래프와 유사하지만 고유한 런타임 애플리케이션의 구성에 대한 많은 쿼리 작업에 적합합니다.Basically, the logical tree is an approximation of a run time object graph at the framework level, which excludes visuals, but is adequate for many querying operations against your own run time application's composition.

또한 초기 요청 개체에 대 한 Resources 컬렉션에 대 한 논리 트리를 위쪽으로 조회 한 다음 논리 트리를 진행 하 고 각 FrameworkElement (또는 FrameworkContentElement)를 확인 하 여 정적 및 동적 리소스 참조를 모두 확인 합니다. 해당 키를 포함할 수 있는 ResourceDictionary을 포함 하는 다른 Resources 값입니다.In addition, both static and dynamic resource references are resolved by looking upwards through the logical tree for Resources collections on the initial requesting object, and then continuing up the logical tree and checking each FrameworkElement (or FrameworkContentElement) for another Resources value that contains a ResourceDictionary, possibly containing that key. 논리 트리와 시각적 트리가 모두 있을 경우 논리 트리가 리소스 조회에 사용됩니다.The logical tree is used for resource lookup when both the logical tree and the visual tree are present. 리소스 사전 및 조회에 대한 자세한 내용은 XAML 리소스를 참조하세요.For more information on resource dictionaries and lookup, see XAML Resources.

논리 트리의 구성Composition of the Logical Tree

논리 트리는 WPF 프레임 워크 수준에서 정의 됩니다. 즉, 논리적 트리 작업에 가장 적합 한 WPF 기본 요소가 FrameworkElement 또는 FrameworkContentElement입니다.The logical tree is defined at the WPF framework-level, which means that the WPF base element that is most relevant for logical tree operations is either FrameworkElement or FrameworkContentElement. 그러나 실제로 LogicalTreeHelper API를 사용 하는 것 처럼 논리 트리에는 FrameworkElement 또는 FrameworkContentElement되지 않는 노드가 포함 될 수도 있습니다.However, as you can see if you actually use the LogicalTreeHelper API, the logical tree sometimes contains nodes that are not either FrameworkElement or FrameworkContentElement. 예를 들어 논리 트리는 문자열인 TextBlockText 값을 보고 합니다.For instance, the logical tree reports the Text value of a TextBlock, which is a string.

논리 트리 재정의Overriding the Logical Tree

고급 컨트롤 작성자는 일반 개체 또는 콘텐츠 모델이 논리 트리 내에서 개체를 추가 하거나 제거 하는 방법을 정의 하는 여러 Api를 재정의 하 여 논리적 트리를 재정의할 수 있습니다.Advanced control authors can override the logical tree by overriding several APIs that define how a general object or content model adds or removes objects within the logical tree. 논리 트리를 재정의하는 방법에 대한 예제는 논리 트리 재정의를 참조하세요.For an example of how to override the logical tree, see Override the Logical Tree.

속성 값 상속Property Value Inheritance

속성 값 상속은 혼합 트리를 통해 작동합니다.Property value inheritance operates through a hybrid tree. 속성 상속을 가능 하 게 하는 Inherits 속성을 포함 하는 실제 메타 데이터는 WPF 프레임 워크 수준 FrameworkPropertyMetadata 클래스입니다.The actual metadata that contains the Inherits property that enables property inheritance is the WPF framework-level FrameworkPropertyMetadata class. 따라서 원래 값을 포함 하는 부모와 해당 값을 상속 하는 자식 개체 모두 FrameworkElement 하거나 FrameworkContentElement해야 하며 둘 다 논리적 트리의 일부 여야 합니다.Therefore, both the parent that holds the original value and the child object that inherits that value must both be FrameworkElement or FrameworkContentElement, and they must both be part of some logical tree. 그러나 속성 상속을 지원하는 기존 WPF 속성의 경우 속성 값 상속은 논리 트리에 없는 중간 개체를 통해 지속될 수 있습니다.However, for existing WPF properties that support property inheritance, property value inheritance is able to perpetuate through an intervening object that is not in the logical tree. 주로 이 기능은 템플릿 요소가 템플릿 기반의 인스턴스 또는 더 높은 수준의 페이지 수준 구성 및 논리 트리의 더 높은 위치에서 설정된 상속된 속성 값을 사용하도록 하려는 경우와 관련이 있습니다.Mainly this is relevant for having template elements use any inherited property values set either on the instance that is templated, or at still higher levels of page-level composition and therefore higher in the logical tree. 속성 값 상속이 이러한 경계에서 일관되게 작동하려면 상속하는 속성을 연결된 속성으로 등록해야 하며 속성 상속 동작으로 사용자 지정 종속성 속성을 정의하려는 경우 이 패턴을 따라야 합니다.In order for property value inheritance to work consistently across such a boundary, the inheriting property must be registered as an attached property, and you should follow this pattern if you intend to define a custom dependency property with property inheritance behavior. 속성 상속에 사용되는 정확한 트리는 도우미 클래스 유틸리티 메서드에서 완전히 예상할 수 없으며, 런타임에도 마찬가지입니다.The exact tree used for property inheritance cannot be entirely anticipated by a helper class utility method, even at run time. 자세한 내용은 속성 값 상속을 참조하세요.For more information, see Property Value Inheritance.

시각적 트리The Visual Tree

WPFWPF에는 논리 트리의 개념 외에 시각적 트리라는 개념도 있습니다.In addition to the concept of the logical tree, there is also the concept of the visual tree in WPFWPF. 시각적 트리는 Visual 기본 클래스로 표시 되는 시각적 개체의 구조를 설명 합니다.The visual tree describes the structure of visual objects, as represented by the Visual base class. 컨트롤에 대한 템플릿을 작성하면 해당 컨트롤에 적용되는 시각적 트리를 정의하거나 다시 정의하는 것입니다.When you write a template for a control, you are defining or redefining the visual tree that applies for that control. 또한 시각적 트리는 성능 및 최적화를 위해 그리기를 낮은 수준으로 제어하려는 개발자에게 유용합니다.The visual tree is also of interest to developers who want lower-level control over drawing for performance and optimization reasons. 기존 WPFWPF 애플리케이션 프로그래밍의 일부로 시각적 트리가 노출되는 한 가지 경우는 라우트된 이벤트에 대한 이벤트 경로가 대부분 논리 트리가 아닌 시각적 트리를 따라 이동하는 경우입니다.One exposure of the visual tree as part of conventional WPFWPF application programming is that event routes for a routed event mostly travel along the visual tree, not the logical tree. 이렇게 미묘한 라우트된 이벤트 동작은 컨트롤 작성자가 아닌 경우 바로 파악되지 않을 수 있습니다.This subtlety of routed event behavior might not be immediately apparent unless you are a control author. 시각적 트리를 통한 이벤트 라우팅에서는 시각적 수준에서 구성을 구현하는 컨트롤을 사용하여 이벤트를 처리하거나 이벤트 setter를 만들 수 있습니다.Routing events through the visual tree enables controls that implement composition at the visual level to handle events or create event setters.

트리, 콘텐츠 요소 및 콘텐츠 호스트Trees, Content Elements, and Content Hosts

콘텐츠 요소 (ContentElement에서 파생 되는 클래스)는 시각적 트리의 일부가 아닙니다. Visual에서 상속 되지 않으며 시각적 표현이 없습니다.Content elements (classes that derive from ContentElement) are not part of the visual tree; they do not inherit from Visual and do not have a visual representation. UI에 표시 되려면 ContentElementVisual 및 논리적 트리 참가자 인 콘텐츠 호스트에서 호스팅되어야 합니다.In order to appear in a UI at all, a ContentElement must be hosted in a content host that is both a Visual and a logical tree participant. 일반적으로 이러한 개체는 FrameworkElement입니다.Usually such an object is a FrameworkElement. 콘텐츠 호스트는 콘텐츠에 대한 "브라우저"와 약간 비슷하며 호스트가 제어하는 화면 영역 내에서 해당 콘텐츠를 표시하는 방법을 선택하는 것으로 개념화할 수 있습니다.You can conceptualize that the content host is somewhat like a "browser" for the content and chooses how to display that content within the screen region that the host controls. 호스트된 콘텐츠는 일반적으로 시각적 트리와 연관된 특정 트리 프로세스의 참가자가 될 수 있습니다.When the content is hosted, the content can be made a participant in certain tree processes that are normally associated with the visual tree. 일반적으로 FrameworkElement 호스트 클래스에는 호스트 된 콘텐츠가 진정한 시각적 트리의 일부가 아니더라도 콘텐츠 논리 트리의 하위 노드를 통해 호스트 된 ContentElement를 이벤트 경로에 추가 하는 구현 코드가 포함 됩니다.Generally, the FrameworkElement host class includes implementation code that adds any hosted ContentElement to the event route through subnodes of the content logical tree, even though the hosted content is not part of the true visual tree. 이는 ContentElement가 자체가 아닌 모든 요소로 라우팅하는 라우트된 이벤트를 원본으로 사용할 수 있도록 하기 위해 필요 합니다.This is necessary so that a ContentElement can source a routed event that routes to any element other than itself.

트리 순회Tree Traversal

LogicalTreeHelper 클래스는 논리 트리 순회를 위한 GetChildren, GetParentFindLogicalNode 메서드를 제공 합니다.The LogicalTreeHelper class provides the GetChildren, GetParent, and FindLogicalNode methods for logical tree traversal. 대부분의 경우 기존 컨트롤의 논리 트리를 트래버스할 필요가 없습니다. 이러한 컨트롤은 거의 항상 논리 자식 요소를 Add, 인덱서 등 컬렉션 액세스를 지원하는 전용 컬렉션 속성으로 노출하기 때문입니다.In most cases, you should not have to traverse the logical tree of existing controls, because these controls almost always expose their logical child elements as a dedicated collection property that supports collection access such as Add, an indexer, and so on. 트리 순회는 주로 컬렉션 속성이 이미 정의 된 ItemsControl 또는 Panel와 같은 의도 된 컨트롤 패턴에서 파생 되지 않도록 선택 하 고 고유한 컬렉션 속성을 제공 하려는 컨트롤 작성자가 사용 하는 시나리오입니다. 지원은.Tree traversal is mainly a scenario that is used by control authors who choose not to derive from intended control patterns such as ItemsControl or Panel where collection properties are already defined, and who intend to provide their own collection property support.

시각적 트리는 VisualTreeHelper시각적 트리 순회에 대 한 도우미 클래스도 지원 합니다.The visual tree also supports a helper class for visual tree traversal, VisualTreeHelper. 시각적 트리는 컨트롤별 속성을 통해 편리 하 게 노출 되지 않으므로 프로그래밍 시나리오에 필요한 경우에는 시각적 트리를 트래버스하는 데 VisualTreeHelper 클래스가 권장 되는 방법입니다.The visual tree is not exposed as conveniently through control-specific properties, so the VisualTreeHelper class is the recommended way to traverse the visual tree if that is necessary for your programming scenario. 자세한 내용은 WPF 그래픽 렌더링 개요를 참조하세요.For more information, see WPF Graphics Rendering Overview.

참고

경우에 따라 적용된 템플릿의 시각적 트리를 검사해야 합니다.Sometimes it is necessary to examine the visual tree of an applied template. 이 기술을 사용할 때는 주의해야 합니다.You should be careful when using this technique. 템플릿을 정의 하는 컨트롤에 대 한 시각적 트리를 트래버스하는 경우에도 컨트롤의 소비자는 인스턴스에서 Template 속성을 설정 하 여 항상 템플릿을 변경할 수 있으며, 최종 사용자는 시스템을 변경 하 여 적용 된 템플릿에 영향을 줄 수 있습니다. 테마나.Even if you are traversing a visual tree for a control where you define the template, consumers of your control can always change the template by setting the Template property on instances, and even the end user can influence the applied template by changing the system theme.

"트리"로 라우트된 이벤트에 대한 경로Routes for Routed Events as a "Tree"

앞서 언급했듯이 지정된 라우트된 이벤트의 경로는 시각적 트리와 논리 트리 표현이 혼합된 트리의 미리 결정된 단일 경로를 따라 이동합니다.As mentioned before, the route of any given routed event travels along a single and predetermined path of a tree that is a hybrid of the visual and logical tree representations. 이벤트 경로는 라우트된 터널링 이벤트인지 버블링 이벤트인지에 따라 트리 내에서 위쪽이나 아래쪽 방향으로 이동할 수 있습니다.The event route can travel either in the up or down directions within the tree depending on whether it is a tunneling or bubbling routed event. 이벤트 경로 개념에는 실제로 라우트되는 이벤트를 발생시키는 것과 별개로 이벤트 경로를 "이동"하는 데 사용할 수 있는 직접적인 지원 도우미 클래스가 없습니다.The event route concept does not have a directly supporting helper class that could be used to "walk" the event route independently of raising an event that actually routes. 경로를 나타내는 클래스는 EventRoute있지만 해당 클래스의 메서드는 일반적으로 내부용 으로만 사용 됩니다.There is a class that represents the route, EventRoute, but the methods of that class are generally for internal use only.

리소스 사전 및 트리Resource Dictionaries and Trees

페이지에 정의된 모든 Resources에 대한 리소스 사전 조회는 기본적으로 논리 트리를 트래버스합니다.Resource dictionary lookup for all Resources defined in a page traverses basically the logical tree. 논리 트리에 없는 개체는 키 지정 리소스를 참조할 수 있지만 리소스 조회 시퀀스는 해당 개체가 논리 트리와 연결되는 지점에서 시작됩니다.Objects that are not in the logical tree can reference keyed resources, but the resource lookup sequence begins at the point where that object is connected to the logical tree. WPF에서 논리적 트리 노드만 ResourceDictionary를 포함 하는 Resources 속성을 가질 수 있으므로 ResourceDictionary에서 키가 지정 된 리소스를 찾는 시각적 트리를 트래버스하는 이점을 누릴 수 없습니다.In WPF, only logical tree nodes can have a Resources property that contains a ResourceDictionary, therefore there is no benefit in traversing the visual tree looking for keyed resources from a ResourceDictionary.

그러나 리소스 조회는 직접적인 논리 트리를 넘어 확장될 수도 있습니다.However, resource lookup can also extend beyond the immediate logical tree. 애플리케이션 태그의 경우 리소스 조회가 애플리케이션 수준 리소스 사전까지 계속된 다음 정적 속성이나 키로 참조되는 테마 지원 및 시스템 값까지 계속될 수 있습니다.For application markup, the resource lookup can then continue onward to application-level resource dictionaries and then to theme support and system values that are referenced as static properties or keys. 테마 자체는 리소스 참조가 동적인 경우 테마 논리 트리 외부의 시스템 값을 참조할 수도 있습니다.Themes themselves can also reference system values outside of the theme logical tree if the resource references are dynamic. 리소스 사전 및 조회 논리에 대한 자세한 내용은 XAML 리소스를 참조하세요.For more information on resource dictionaries and the lookup logic, see XAML Resources.

참조See also