Infragistics XamDataGrid パフォーマンスの最適化

0 ユーザーが評価
この投稿には確認済みの回答があります。 0 返信 | 1 サポーター

トップ 10 投稿者 
女性
投稿 18
IG Employee
[IG] Yoshimi 投稿済み: 2010/12/10 14:36

Infragistics XamDataGrid パフォーマンスの最適化

元記事 (英語): Kiril Matev  - http://community.infragistics.com/blogs/kiril_matev/archive/2010/10/26/optimizing-xamdatagrid-performance.aspx

XamDataGrid コンポーネントは NetAdvantage for WPF Line of Business 製品で最も人気のあるコントロールの 1 つです (無料トライアル版のダウンロードはこちらから)。表形式でデータを表示し、グループ化、並べ替え、フィルタリング、列集計など、さまざまな機能があります。 また、XamDataGrid は、リアルタイムに大量なデータを更新する機能があります。 その場合、XamDataGrid  のパフォーマンスがアプリケーションのユーザビリティにおいて大変重要になります。 そこで、この記事ではパフォーマンスの最大限に向上する方法をご紹介します。

サンプル プロジェクト

まずパフォーマンスの最適化を実現した XamDataGrid のサンプル プロジェクトをダウンロードしてください。このプロジェクトは Visual Studio 2010 で実装されています。また、プロジェクトを実行するには NetAdvantage for WPF Line of Business 10.3 が必要になります。技術サポートも無料で提供されるトライアル版はこちらからダウンロードできます。

左側に表示される手順に沿って XamDataGrid パフォーマンスを向上させる設定を学ぶことができます。

ビルトインの最適化

XamDataGrid はさまざまなメソッドを内部で使用することによって高いパフォーマンスの実現を可能とします。レコードとセル レベルでプレゼンター要素を再利用し、スタイル情報をキャッシュ、ツールチップ スクロールおよびオブジェクトの作成を遅延します。詳細については『パフォーマンスの最適化の概要』をご覧ください。 これらの最適化すべてがコントロールに組み込まれています。

以下に同じプロジェクトでさまざまなシナリオを実行した際の重要事項をリストにしました。 各設定がアプリケーションの外観や動作にどう影響するかを確認し、プロジェクト要件に合った最適な方法を選んで使用してみてください。

スタイル設定

パフォーマンスを向上するには、スタイルを設定します。これにより、最もよく使用されるビジュアル要素に色と効果を適用しなくて済みます。
たとえば、ホバーされた行に色を設定しないことなどが挙げられます。XamDataGrid のホバーレス スタイルをダウンロードしてください。もちろんスタイル プロパティのいくつかを使用することは構いません。
以下はプロジェクトにファイルを追加し、XamDataGrid から参照する方法です。

<igDP:XamDataGrid.Resources>
<ResourceDictionary Source="HoverlessStyles.xaml" />
</igDP:XamDataGrid.Resources>

CellValuePresentersなどで要素にテンプレートを定義する場合がよくありますが、できるだけ要素を使わないようにします。 テンプレートは、表示されるすべての CellValuePresenters に初期化されるため、ビジュアル 要素をすばやく増やすことができ、これによってパフォーマンスを向上します。 詳細は、『スタイルがコントロールのパフォーマンスに与える影響』をご覧ください。

含まれる コントロールの XamDataGrid パフォーマンスへの影響

Bitmap 効果はパフォーマンスに多大な影響を生じるため、XamDataGrid に含まれるコントロールまたは XamDataGridd 要素で使用しないようにします。

StackPanel コントロールに XamDataGrid  を使用する場合、レコードを表示するためにサイズが無限の領域を持つことになるため、すべてのセルに CellValuePresenters を描画することになります。スクローリングが StackPanel によって正しく処理されるかもしれませんが、大量な表示によるメモリ フットプリントが膨大になります。

テーマ

さまざまな要素に使用するテンプレートの決定に一定のオーバーヘッドがあります。使用するテーマを設定することによってパフォーマンスを向上することが可能です。以下は Aero を使用した例です。

<igDP:XamDataGrid Theme="Aero" />

FieldCollection の使用

データ プレゼンターにビジュアル要素のある FieldLayoutFields コレクションからフィールドを追加または削除する場合、パフォーマンスを低下させます。
コレクションに複数の変更を加える場合、変更する前に BeginUpdate を呼び出し、変更後には EndUpdate を呼び出します。

 イベントの抑制

処理しないルーティング イベントを抑制することによってパフォーマンスを向上できます。 階層要素のルーティング イベントで発生したオーバーヘッドによってパフォーマンスが向上されます。 CLR イベントがDataPresenterBase の共通ルーティングイベントに追加されます。 CellActivated ルーティング イベントの場合、ルーティング イベントの名前は CellActivatedDirect のように Direct で始まります。 ルーティング イベントを抑制しながら、それに相当するイベントも処理します。

イベントを抑制するには、 DataPresenterBase.SuppressedEvents コレクションに追加します。同じプロジェクトで実装していますが以下でもご覧いただけます。

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:igDP="http://infragistics.com/DataPresenter"
    xmlns:igED="http://infragistics.com/Editors"
    Title="Window1" Height="600" Width="800">
    <Grid>
        <igDP:XamDataGrid>
            <igDP:XamDataGrid.SuppressedEvents>
                <igDP:RoutedEventWrapper RoutedEvent="igED:ValueEditor.TextChanged" />


                <igDP:RoutedEventWrapper RoutedEvent="igED:ValueEditor.ValueChanged" />
            </igDP:XamDataGrid.SuppressedEvents>
        </igDP:XamDataGrid>
    </Grid>
</Window>

レコードのサイズ変更モード

FieldLayoutSettings.DataRecordSizing モード プロパティは、XamDataGrid のサイズ変更の記録を制御します。このプロパティは、各行を個別にサイズ変更するか行を同じ高さにするかどうかを制御するため、パフォーマンスに影響を及ぼします。

このプロパティの Fixed および SizableSynchronized 値によって行の高さが均等になります。 この 2 つの設定はパフォーマンスに最も影響を及ぼします。XamDataGrid が、レイアウト処理で追加のリソースを必要とする高さの異なる行の配置よりも、同じ高さの行を配置する方がより速く処理できるためです。

FieldLayoutSettings.DataRecordSizing の SizedToContentAndFixed および  SizedToContentAndIndividuallySizable 値によってサイズの違う行になります。
これらの設定はレイアウトである程度の柔軟性はありますが、追加のリソースを必要とするために、スクロール時の XamDataGrid のパフォーマンスを低下させます。

スクロール モードの設定

XamDataGrid のデフォルトのサムネール スクロール動作は、遅延スクロールで表示されるレコードの列値をツールチップで表示します。これは、IsScrollTipField プロパティで指定できます。これにより、スクロールを中止して現在のレコード行の値を確認する必要がなく、特定の列の値を使用してレコードをすばやく見つけることができます。

即時スクロールを有効にするには、 ScrollingMode プロパティを Immediate に設定します。 即時スクロールは遅延スクロールと異なり、スクロールした場所のれコートを表示しなければなりません。 この場合、多くのビジュアル要素の操作が必要になるため、パフォーマンスが低下します。 即時スクロール モードをできるだけ使用しないことをお勧めします。

セル プレゼンターの視覚化

XamDataGrid のレコードとセル プレゼンターの表示は、RecordContainerGenerationMode および CellContainerGenerationMode プロパティを使用して制御できます。 次はさまざまな視覚化の方法、領域と時間の関係などを役立つ情報をご紹介します。

リサイクル

XamDataGrid  は、プレゼンターをリサイクルします。表示レコード/セルのプレゼンターのみを初期化し、スクロールされると再利用します。 このキャッシュ モードは、メモリ フットプリントを最小化して全般的なデータのブラウジングを最適化します。 このアプローチはメモリを節約し、ほとんどのケースで問題なく動作しますが、特に複雑な要素階層を含む XamDateTimeEditor などのエディターではスクロールに少々問題が生じる場合があります。

PreLoad

次に、 XamDateTimeEditors などの複雑なエディターに多くの列があり、追加の列をすばやく表示する水平スクロールが必要なケースを想定してみましょう。
PreLoad を使用して XamDataGrid はすべてのセルのプレゼンターを初期化し、スムーズなスクロールが可能になります。これには初期の読み込み時間とメモリ フットプリントが増加します。PreLoad 設定は、行数 (RecordContainerGenerationMode を設定している場合) または列数 (CellContainerGenerationMode を設定している場合) が少ない場合のみ使用してください。そうでない場合は読み込み時間とメモリ フットプリントが大幅に増加します。

LazyLoad

レコード量が少ないが大量の列があり、ユーザーが常にすべての列を表示するわけではないような場合はどうでしょう。このようなケースでは、列のプレゼンターを一度初期化するだけで、表示されている列スクロールの速さを保ちながらメモリ フットプリントを最小限に抑えることができます。表示したときに列をキャッシュして 2 度目に表示するときのパフォーマンスを向上します。多少の読み込み時間と表示されているすべてのセルのプレゼンターを含むメモリフット プリントが追加されます。これはXamDataGrid  (PreLoad の場合) を読み込むためです。そのため最初にセルを表示した場合のみスクロール パフォーマンスに影響します。同じセルを 2 度目に表示する場合、最初に表示したときにプレゼンターがキャッシュされているため速くなります。

階層

パフォーマンスを向上するため、XamDataGrid は、親レコードと子レコードを表示にデフォルトで単一のパネルを使用します。 ただし、以下の問題があります。

  • 入れ子レコードはクロムでは囲まれません。
  • 入れ子レコードの RecordPresenter オブジェクト テンプレートのトリガーは無視されます。
  • 入れ子レコードの RecordPresenter オブジェクト テンプレートのアニメーションは無視されます。

上記の機能のどれかを使用する場合は、GridViewSettingsUseNestedPanels プロパティを True に設定して、複数の入れ子パネルを使用できます。詳細については 『階層的なレコードとパフォーマンス』を参照してください。

おわりに

この記事では、XamDataGrid のパフォーマンスを向上するさまざまな方法をご紹介しました。 次回のアプリケーション構築に是非お役立てください。

 

ページ 1 / 1 (1 項目) | RSS
Infragistics Japan
インフラジスティックス ジャパン