パフォーマンスの最適化:コントロールOptimizing performance: Controls

Windows Presentation Foundation (WPF) には、ほとんどの 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

などの WPF コントロール、ListViewComboBoxアプリケーションで項目のリストを表示するために使用します。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 の仮想化が有効になって、ListViewListBoxがリスト項目をデータにバインドされたときを制御します。By default, UI virtualization is enabled for the ListView and ListBox controls when their list items are bound to data. TreeView 設定して、仮想化を有効にすることができます、VirtualizingStackPanel.IsVirtualizing添付プロパティをtrueします。TreeView virtualization can be enabled by setting the VirtualizingStackPanel.IsVirtualizing attached property to true. 派生するカスタム コントロールの UI の仮想化を有効にするかどうかはItemsControlまたは既存の項目のコントロールを使用して、StackPanelクラスなど、 ComboBox、設定することができます、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

UI の仮想化から継承するコントロール用の .NET Framework 3.5 SP1 で追加するよう最適化ItemsControlコンテナーのリサイクル、 もスクロールのパフォーマンスが向上することができます。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. ときに、ItemsControlを使用して UI の仮想化が設定されると、項目コンテナーが表示されるまでスクロールし、各項目をスクロールして非表示の項目コンテナーを破棄する各アイテムが作成されます。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. 項目のリサイクル設定を有効にすることができます、VirtualizationMode添付プロパティをRecyclingします。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クラスなどの仮想メソッドを公開OnViewportSizeChangedLineUpPageUp、およびMouseWheelUpします。これらの仮想メソッドを使用すると、一覧の表示部分の変更を検出し、適切に処理できます。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.

コントロールControl 仮想化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