イントレ
  • 新規
  • ペイント
  • 一覧
  • 管理
  • Home
  • ダウンロード
  • 日記
  • イラスト
  • リンク
  • About
  •  RSS

本文へジャンプ


イントレ。

« Prev | Today | Next »

WPFのListBoxの仮想モード。

[日記]  >> 2010/02/06 (土) | 20:22:14 | 魅椥 愁
WinFormsの時はListView使ってVirtualMode=true、VirtualListSizeを設定し、
RetrieveVirtualItemイベントに反応してListViewItemを生成してやればよかったんだけど、
WPFだと仕組み的な部分も含めてちょっと面倒。

通常であればListBox.ItemsSourceにコレクションをバインディング。
ListBox.ItemContainerGeneratorが必要に応じてコンテナ(ListBoxItem)を生成、表示される。
ItemsControl系はこんな動作。

これを仮想モードにするには、コントロールにいくつか設定をする。
・ItemsPanelにVirtualizingStackPanelを設定
 - ListBoxだと規定で使用される
・ScrollViewer.CanContentScroll=True
 - コンテンツ単位でスクロール(ListBox規定)、Falseだとピクセル単位でスクロールするが仮想化無効
・VirtualizingStackPanel.IsVirtualizing=True
 - ListBox規定はTrue、Falseで仮想化無効
// 以下おまけ
・ScrollViewer.IsDeferredScrollingEnabled=False
 - 遅延スクロール、Trueだとつまみをドラッグしている間はスクロールされないため、
  データが必要にならず多少メモリ消費が抑えられる。
  ListBox規定はFalse
・VirtualizingStackPanel.VirtualizationMode=Recycling
 - コンテナを使いまわすためメモリ消費がかなり抑えられるが、
  ItemsContainerGeneratorで取得したコンテナインスタンスを保持して操作すると思わぬバグに。
  ListBox規定はStandard(毎回生成)。

これでコンテナコントロール(ListBoxItem)の仮想化はすむんだけど、
ItemsSourceに突っ込む分のデータはどうして用意しないといけないみたい。

例えば10万ぐらいの項目があった場合、正直にデータを用意するとメモリを圧迫する可能性があるけど、
プロパティにアクセスされてから初めてデータを用意する、キャッシュする、一定個数キャッシュされたら消すなどの工夫でなんとかなりそう。


Loading...

HTML creation time [0.10sec.]
"intre." by MinagiSyu, sense 1999.11.23.
Powered by Nucleus CMS v3.41

Utilities

タグ
.NET | SAP1x | SAPFx | 園芸 | WPF | サッカー | PCパーツ | C# | ツクールもどき | Windows 7 | ...すべてのタグ
カレンダー
<   2010-02   >
日月火水木金土
 123456
78910111213
14151617181920
21222324252627
28      
最近の更新
    2010-08-31
  • [日記] SAPFx 3.1.0.7。
  • [更新履歴] SmartAudioPlayer Fx 3.1.0.7 リリース。
  • 2010-07-30
  • [日記] 久々のSAPFxリリース。
  • [更新履歴] SmartAudioPlayer Fx 3.1.0.6 をリリース。
  • [ダウンロード] SmartAudioPlayer Fx
  • 2010-07-11
  • [日記] WebMatrixが本気過ぎる件。
  • 2010-06-23
  • [日記] Google Reader APIの認証がまた変わった?
Adsense