パフォーマンスの最適化: コントロール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

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 から派生したカスタムコントロールや、ComboBoxなどの StackPanel クラスを使用する既存の項目コントロールに対して 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 SP1 で追加された 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. 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 クラスは、OnViewportSizeChangedLineUpPageUpMouseWheelUpなどの仮想メソッドを公開します。これらの仮想メソッドを使用すると、リストの可視部分の変更を検出し、それに応じて処理することができます。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を作成すると、ビジュアルツリー内の ClassicBorderDecorator オブジェクトと ContentPresenter オブジェクトも取得されます。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