성능 최적화: 컨트롤Optimizing performance: Controls

WPF (Windows Presentation Foundation)에는 대부분의 Windows 응용 프로그램에서 사용 되는 일반적인 UI (사용자 인터페이스) 구성 요소가 많이 포함 되어 있습니다.Windows Presentation Foundation (WPF) includes many of the common user-interface (UI) components that are used in most Windows applications. 이 항목에서는 UI의 성능을 향상시킬 수 있는 기술에 대해 설명합니다.This topic contains techniques for improving the performance of your UI.

대량 데이터 집합 표시Displaying large data sets

ListViewComboBox 같은 WPF 컨트롤은 응용 프로그램에서 항목 목록을 표시 하는 데 사용 됩니다.WPF controls such as the ListView and ComboBox are used to display lists of items in an application. 표시할 목록이 크면 애플리케이션의 성능에 영향을 줄 수 있습니다.If the list to display is large, the application's performance can be affected. 그 이유는 표준 레이아웃 시스템에서는 목록 컨트롤과 연결된 각 항목에 대해 레이아웃 컨테이너를 만들고 해당 레이아웃의 크기와 위치를 계산하기 때문입니다.This is because the standard layout system creates a layout container for each item associated with the list control, and computes its layout size and position. 대개는 모든 항목을 동시에 표시할 필요가 없습니다. 대신 항목의 일부만 표시하고 사용자가 목록을 스크롤하면 됩니다.Typically, you do not have to display all the items at the same time; instead you display a subset, and the user scrolls through the list. 이 경우에는 UI 가상화를 사용하는 것이 적합합니다. 가상화를 사용하면 항목이 실제로 표시될 때까지 해당 항목에 대한 항목 컨테이너 생성 및 연결된 레이아웃에 대한 계산이 지연됩니다.In this case, it makes sense to use UI virtualization, which means the item container generation and associated layout computation for an item is deferred until the item is visible.

UI 가상화는 목록 컨트롤의 중요한 요소입니다.UI Virtualization is an important aspect of list controls. UI 가상화를 데이터 가상화와 혼동해서는 안 됩니다.UI virtualization should not be confused with data virtualization. UI 가상화의 경우 표시 가능한 항목만 메모리에 저장되지만 데이터 바인딩 시나리오에서는 전체 데이터 구조가 메모리에 저장됩니다.UI virtualization stores only visible items in memory but in a data-binding scenario stores the entire data structure in memory. 반면 데이터 가상화의 경우 화면에 표시되는 데이터 항목만 메모리에 저장됩니다.In contrast, data virtualization stores only the data items that are visible on the screen in memory.

기본적으로 UI 가상화는 ListView에 대해 사용 하도록 설정 되며 목록 항목이 데이터에 바인딩될 때 컨트롤을 ListBox 합니다.By default, UI virtualization is enabled for the ListView and ListBox controls when their list items are bound to data. VirtualizingStackPanel.IsVirtualizing 연결 된 속성을 true로 설정 하 여 TreeView 가상화를 사용 하도록 설정할 수 있습니다.TreeView virtualization can be enabled by setting the VirtualizingStackPanel.IsVirtualizing attached property to true. ItemsControl 또는 StackPanel 클래스를 사용 하는 기존 항목 컨트롤 (예: ComboBox)에서 파생 되는 사용자 지정 컨트롤에 대 한 UI 가상화를 사용 하도록 설정 하려면 ItemsPanelVirtualizingStackPanel로 설정 하 고 IsVirtualizingtrue로 설정 하면 됩니다.If you want to enable UI virtualization for custom controls that derive from ItemsControl or existing item controls that use the StackPanel class, such as ComboBox, you can set the ItemsPanel to VirtualizingStackPanel and set IsVirtualizing to true. 그러나 자신도 모르게 이러한 컨트롤의 UI 가상화 기능이 해제될 수 있습니다.Unfortunately, you can disable UI virtualization for these controls without realizing it. UI 가상화는 다음과 같은 경우에 해제됩니다.The following is a list of conditions that disable UI virtualization.

항목 컨테이너를 가상화할 때 항목에 속한 항목 컨테이너와 관련된 추가 상태 정보가 있는지 여부를 고려해야 합니다.An important consideration when you virtualize item containers is whether you have additional state information associated with an item container that belongs with the item. 이 경우 추가 상태를 저장해야 합니다.In this case, you must save the additional state. 예를 들어 Expander 컨트롤에 포함 된 항목이 있고 IsExpanded 상태가 항목의 컨테이너에 바인딩되고 항목 자체에는 바인딩되지 않을 수 있습니다.For example, you might have an item contained in an Expander control and the IsExpanded state is bound to the item's container, and not to the item itself. 새 항목에 대해 컨테이너를 다시 사용 하는 경우 IsExpanded의 현재 값이 새 항목에 사용 됩니다.When the container is reused for a new item, the current value of IsExpanded is used for the new item. 또한 이전 항목이 올바른 IsExpanded 값을 잃게 됩니다.In addition, the old item loses the correct IsExpanded value.

현재 모든 WPF 컨트롤은 데이터 가상화를 기본적으로 지원하지 않습니다.Currently, no WPF controls offer built-in support for data virtualization.

컨테이너 재활용Container recycling

ItemsControl에서 상속 되는 컨트롤에 대해 .NET Framework 3.5 s p 1에 추가 된 UI 가상화에 대 한 최적화는 컨테이너 재활용으로, 스크롤 성능을 향상 시킬 수도 있습니다.An optimization to UI virtualization added in the .NET Framework 3.5 SP1 for controls that inherit from ItemsControl is container recycling, which can also improve scrolling performance. UI 가상화를 사용 하는 ItemsControl 채워진 경우 뷰로 스크롤 하는 각 항목에 대 한 항목 컨테이너를 만들고 보기에서 스크롤 하는 각 항목에 대 한 항목 컨테이너를 삭제 합니다.When an ItemsControl that uses UI virtualization is populated, it creates an item container for each item that scrolls into view and destroys the item container for each item that scrolls out of view. 컨테이너를 재활용 하면 컨트롤이 다른 데이터 항목에 대해 기존 항목 컨테이너를 다시 사용할 수 있으므로 사용자가 ItemsControl을 스크롤하면 항목 컨테이너가 지속적으로 생성 되 고 제거 되지 않습니다.Container recycling enables the control to reuse the existing item containers for different data items, so that item containers are not constantly created and destroyed as the user scrolls the ItemsControl. RecyclingVirtualizationMode 연결 된 속성을 설정 하 여 항목 재활용을 사용 하도록 선택할 수 있습니다.You can choose to enable item recycling by setting the VirtualizationMode attached property to Recycling.

가상화를 지 원하는 모든 ItemsControl 컨테이너 재활용을 사용할 수 있습니다.Any ItemsControl that supports virtualization can use container recycling. ListBox에서 컨테이너 재활용을 사용 하도록 설정 하는 방법에 대 한 예제는 ListBox의 스크롤 성능 향상을 참조 하세요.For an example of how to enable container recycling on a ListBox, see Improve the Scrolling Performance of a ListBox.

양방향 가상화 지원Supporting bidirectional virtualization

VirtualizingStackPanel는 가로 또는 세로 방향으로 UI 가상화에 대 한 기본 제공 지원을 제공 합니다.VirtualizingStackPanel offers built-in support for UI virtualization in one direction, either horizontally or vertically. 컨트롤에 양방향 가상화를 사용 하려는 경우 VirtualizingStackPanel 클래스를 확장 하는 사용자 지정 패널을 구현 해야 합니다.If you want to use bidirectional virtualization for your controls, you must implement a custom panel that extends the VirtualizingStackPanel class. VirtualizingStackPanel 클래스는 OnViewportSizeChanged, LineUp, PageUpMouseWheelUp와 같은 가상 메서드를 노출 합니다. 이러한 가상 메서드를 사용 하 여 목록에서 표시 되는 부분에 대 한 변경 내용을 감지 하 고 적절 하 게 처리할 수 있습니다.The VirtualizingStackPanel class exposes virtual methods such as OnViewportSizeChanged, LineUp, PageUp, and MouseWheelUp.These virtual methods enable you to detect a change in the visible part of a list and handle it accordingly.

템플릿 최적화Optimizing templates

시각적 트리에는 애플리케이션의 모든 시각적 요소가 포함됩니다.The visual tree contains all the visual elements in an application. 여기에는 직접 만든 개체뿐만 아니라 템플릿 확장에 따른 개체도 포함됩니다.In addition to the objects directly created, it also contains objects due to template expansion. 예를 들어 Button를 만들 때 시각적 트리에서 ClassicBorderDecoratorContentPresenter 개체도 가져올 수 있습니다.For example, when you create a Button, you also get ClassicBorderDecorator and ContentPresenter objects in the visual tree. 컨트롤 템플릿을 최적화하지 않으면 시각적 트리에 수많은 불필요한 개체가 만들어질 수 있습니다.If you haven't optimized your control templates, you may be creating a lot of extra unnecessary objects in the visual tree. 시각적 트리에 대한 자세한 내용은 WPF 그래픽 렌더링 개요를 참조하세요.For more information on the visual tree, see WPF Graphics Rendering Overview.

스크롤 지연Deferred scrolling

기본적으로 사용자가 스크롤 막대의 위치 조정 컨트롤을 끌면 콘텐츠 뷰가 지속적으로 업데이트됩니다.By default, when the user drags the thumb on a scrollbar, the content view continuously updates. 컨트롤의 스크롤 속도가 느린 경우에는 스크롤 지연을 사용하는 것이 좋습니다.If scrolling is slow in your control, consider using deferred scrolling. 스크롤 지연을 사용하면 사용자가 위치 조정 컨트롤을 놓을 때만 콘텐츠가 업데이트됩니다.In deferred scrolling, the content is updated only when the user releases the thumb.

지연 된 스크롤을 구현 하려면 IsDeferredScrollingEnabled 속성을 true로 설정 합니다.To implement deferred scrolling, set the IsDeferredScrollingEnabled property to true. IsDeferredScrollingEnabled는 연결 된 속성 이며 ScrollViewer 및 해당 컨트롤 템플릿에 ScrollViewer 있는 모든 컨트롤에 대해 설정할 수 있습니다.IsDeferredScrollingEnabled is an attached property and can be set on ScrollViewer and any control that has a ScrollViewer in its control template.

성능 기능을 구현 하는 컨트롤Controls that implement performance features

다음 표에서는 데이터를 표시하는 일반적인 컨트롤 및 각 컨트롤에 성능 기능이 지원되는지 여부를 보여 줍니다.The following table lists the common controls for displaying data and their support of performance features. 이러한 기능을 설정하는 방법은 이전 섹션을 참조하세요.See the previous sections for information on how to enable these features.

ControlControl 가상화Virtualization 컨테이너 재활용Container recycling 스크롤 지연Deferred scrolling
ComboBox 사용할 수 있음Can be enabled 사용할 수 있음Can be enabled 사용할 수 있음Can be enabled
ContextMenu 사용할 수 있음Can be enabled 사용할 수 있음Can be enabled 사용할 수 있음Can be enabled
DocumentViewer 사용할 수 없음Not available 사용할 수 없음Not available 사용할 수 있음Can be enabled
ListBox 기본Default 사용할 수 있음Can be enabled 사용할 수 있음Can be enabled
ListView 기본Default 사용할 수 있음Can be enabled 사용할 수 있음Can be enabled
TreeView 사용할 수 있음Can be enabled 사용할 수 있음Can be enabled 사용할 수 있음Can be enabled
ToolBar 사용할 수 없음Not available 사용할 수 없음Not available 사용할 수 있음Can be enabled

참고

TreeView에서 가상화 및 컨테이너 재활용을 사용 하도록 설정 하는 방법에 대 한 예제는 TreeView의 성능 향상을 참조 하세요.For an example of how to enable virtualization and container recycling on a TreeView, see Improve the Performance of a TreeView.

참조See also