イントレ。
2010-02
2010-02-06
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万ぐらいの項目があった場合、正直にデータを用意するとメモリを圧迫する可能性があるけど、
プロパティにアクセスされてから初めてデータを用意する、キャッシュする、一定個数キャッシュされたら消すなどの工夫でなんとかなりそう。
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万ぐらいの項目があった場合、正直にデータを用意するとメモリを圧迫する可能性があるけど、
プロパティにアクセスされてから初めてデータを用意する、キャッシュする、一定個数キャッシュされたら消すなどの工夫でなんとかなりそう。
Utilities
- タグ
- カレンダー
- 最近の更新
- Adsense