성능 최적화: 컨트롤

WPF (Windows Presentation Foundation)에는 대부분의 Windows 응용 프로그램에서 사용 되는 일반적인 UI (사용자 인터페이스) 구성 요소가 많이 포함 되어 있습니다. 이 항목에서는 UI의 성능을 향상시킬 수 있는 기술에 대해 설명합니다.

대량 데이터 집합 표시

및와 같은 WPF 컨트롤 ListView ComboBox 은 응용 프로그램에서 항목 목록을 표시 하는 데 사용 됩니다. 표시할 목록이 크면 애플리케이션의 성능에 영향을 줄 수 있습니다. 그 이유는 표준 레이아웃 시스템에서는 목록 컨트롤과 연결된 각 항목에 대해 레이아웃 컨테이너를 만들고 해당 레이아웃의 크기와 위치를 계산하기 때문입니다. 대개는 모든 항목을 동시에 표시할 필요가 없습니다. 대신 항목의 일부만 표시하고 사용자가 목록을 스크롤하면 됩니다. 이 경우에는 UI 가상화 를 사용하는 것이 적합합니다. 가상화를 사용하면 항목이 실제로 표시될 때까지 해당 항목에 대한 항목 컨테이너 생성 및 연결된 레이아웃에 대한 계산이 지연됩니다.

UI 가상화는 목록 컨트롤의 중요한 요소입니다. UI 가상화를 데이터 가상화와 혼동해서는 안 됩니다. UI 가상화의 경우 표시 가능한 항목만 메모리에 저장되지만 데이터 바인딩 시나리오에서는 전체 데이터 구조가 메모리에 저장됩니다. 반면 데이터 가상화의 경우 화면에 표시되는 데이터 항목만 메모리에 저장됩니다.

기본적으로 UI 가상화는의 ListView ListBox 목록 항목이 데이터에 바인딩될 때 및 컨트롤에 대해 사용 하도록 설정 됩니다. TreeView 연결 된 속성을로 설정 하 여 가상화를 사용 하도록 설정할 수 있습니다 VirtualizingStackPanel.IsVirtualizing true . 에서 파생 되는 사용자 지정 컨트롤이 나 클래스를 사용 하는 기존 항목 컨트롤에 대해 UI 가상화를 사용 하도록 설정 하려는 경우를 ItemsControl StackPanel ComboBox 로 설정 ItemsPanelVirtualizingStackPanel 고를로 설정 하면 IsVirtualizing true 됩니다. 그러나 자신도 모르게 이러한 컨트롤의 UI 가상화 기능이 해제될 수 있습니다. UI 가상화는 다음과 같은 경우에 해제됩니다.

항목 컨테이너를 가상화할 때 항목에 속한 항목 컨테이너와 관련된 추가 상태 정보가 있는지 여부를 고려해야 합니다. 이 경우 추가 상태를 저장해야 합니다. 예를 들어, 컨트롤에 항목이 포함 되어 있고 Expander IsExpanded 상태가 항목 자체에 대 한 항목이 아니라 항목의 컨테이너에 바인딩되어 있을 수 있습니다. 새 항목에 대해 컨테이너를 다시 사용 하면의 현재 값 IsExpanded 이 새 항목에 사용 됩니다. 또한 이전 항목이 올바른 값을 잃게 IsExpanded 됩니다.

현재 모든 WPF 컨트롤은 데이터 가상화를 기본적으로 지원하지 않습니다.

컨테이너 재활용

에서 상속 되는 컨트롤에 대해 .NET Framework 3.5 s p 1에 추가 된 UI 가상화에 대 한 최적화는 ItemsControl 컨테이너 재활용으로, 스크롤 성능을 향상 시킬 수도 있습니다. ItemsControlUI 가상화를 사용 하는가 채워지는 경우 뷰로 스크롤되는 각 항목에 대 한 항목 컨테이너를 만들고 보기에서 스크롤 하는 각 항목에 대 한 항목 컨테이너를 소멸 시킵니다. 컨테이너를 재활용 하면 컨트롤이 다른 데이터 항목에 대해 기존 항목 컨테이너를 다시 사용할 수 있으므로 사용자가를 스크롤하면 항목 컨테이너가 지속적으로 생성 되 고 제거 되지 않습니다 ItemsControl . 연결 된 속성을로 설정 하 여 항목 재활용을 사용 하도록 선택할 수 있습니다 VirtualizationMode Recycling .

ItemsControl가상화를 지 원하는 모든에서 컨테이너 재활용을 사용할 수 있습니다. 에서 컨테이너 재활용을 사용 하도록 설정 하는 방법에 대 한 예제는 ListBox ListBox의 스크롤 성능 향상을 참조 하세요.

양방향 가상화 지원

VirtualizingStackPanel 는 가로 또는 세로 방향으로 UI 가상화에 대 한 기본 제공 지원을 제공 합니다. 컨트롤에 양방향 가상화를 사용 하려는 경우 클래스를 확장 하는 사용자 지정 패널을 구현 해야 합니다 VirtualizingStackPanel . VirtualizingStackPanel클래스는,, 및과 같은 가상 메서드를 노출 OnViewportSizeChanged LineUp PageUp MouseWheelUp 합니다. 이러한 가상 메서드를 사용 하 여 목록에서 표시 되는 부분에 대 한 변경 내용을 감지 하 고 적절 하 게 처리할 수 있습니다.

템플릿 최적화

시각적 트리에는 애플리케이션의 모든 시각적 요소가 포함됩니다. 여기에는 직접 만든 개체뿐만 아니라 템플릿 확장에 따른 개체도 포함됩니다. 예를 들어를 만들 때 Button ClassicBorderDecorator 시각적 트리에서 및 개체도 가져올 수 있습니다 ContentPresenter . 컨트롤 템플릿을 최적화하지 않으면 시각적 트리에 수많은 불필요한 개체가 만들어질 수 있습니다. 시각적 트리에 대한 자세한 내용은 WPF 그래픽 렌더링 개요를 참조하세요.

스크롤 지연

기본적으로 사용자가 스크롤 막대의 위치 조정 컨트롤을 끌면 콘텐츠 뷰가 지속적으로 업데이트됩니다. 컨트롤의 스크롤 속도가 느린 경우에는 스크롤 지연을 사용하는 것이 좋습니다. 스크롤 지연을 사용하면 사용자가 위치 조정 컨트롤을 놓을 때만 콘텐츠가 업데이트됩니다.

지연 된 스크롤을 구현 하려면 IsDeferredScrollingEnabled 속성을로 설정 true 합니다. IsDeferredScrollingEnabled 는 연결 된 속성 이며에 설정 될 수 있으며, 컨트롤 템플릿에가 있는 모든 컨트롤을 설정할 수 있습니다 ScrollViewer ScrollViewer .

성능 기능을 구현 하는 컨트롤

다음 표에서는 데이터를 표시하는 일반적인 컨트롤 및 각 컨트롤에 성능 기능이 지원되는지 여부를 보여 줍니다. 이러한 기능을 설정하는 방법은 이전 섹션을 참조하세요.

제어 가상화 컨테이너 재활용 스크롤 지연
ComboBox 사용할 수 있음 사용할 수 있음 사용할 수 있음
ContextMenu 사용할 수 있음 사용할 수 있음 사용할 수 있음
DocumentViewer 사용할 수 없음 사용할 수 없음 사용할 수 있음
ListBox 기본값 사용할 수 있음 사용할 수 있음
ListView 기본값 사용할 수 있음 사용할 수 있음
TreeView 사용할 수 있음 사용할 수 있음 사용할 수 있음
ToolBar 사용할 수 없음 사용할 수 없음 사용할 수 있음

참고

에서 가상화 및 컨테이너 재활용을 사용 하도록 설정 하는 방법에 대 한 예제는 TreeView TreeView의 성능 향상을 참조 하세요.

참고 항목