Book というクラスがあります。
class Book
{
public string Name { get; set; }
public string Author { get; set; }
public int PagesCount { get; set; }
public int Category { get; set; }
}
ListBox はブックのリストを表示し、ItemTemplate はブックを視覚的に表すように変更されています。テキストには、本の名前、著者、ページ数が表示されます。ただし、カテゴリは特定の色で表されます (たとえば、履歴は青、ロマンスは赤など)。これで、テキストには OuterGlowBitmap Effect と、カテゴリ (int) から適切な色への値コンバーターが含まれます。すべてが ListBoxItem の DataTemplate にバインドされています。技術的には、すべて正常に動作します。
ただし、問題はパフォーマンスです。outerGlow ビットマップ効果はプロセッサに負担がかかるようです。そのため、約 500 冊の本のリストがある場合、データベースからデータを取得するのに約 500 ミリ秒かかりますが、アイテムを実際に ListBox にロードするのに約 10 秒かかります。また、読み込みが完了しても、スクロールが非常に遅くなります。VirtualizingStackPanel.IsVirtualizing を True に設定しようとしましたが、役に立ちませんでした。(任意の時点でデータベースに存在できる本の最大数は約 30000 です。)
ただし、リストボックスに 100 を超える項目がある場合でも、人間の頭ではそれほど速く処理できないため、検索されたすべての本を読み込んでユーザーに一覧表示することは目指していません。そのため、実際にリストボックスを ObservableCollection オブジェクトにバインドするラッパー ナビゲーション クラス BookNavigator を作成しました。すべての本がこの BookNavigator にロードされますが、(observableCollection に追加することにより) リストボックスに表示されるのは X 本だけです。
これに関する問題は、リストボックスがスクロールバーを表示しないように、表示される本の数を十分に小さくしたいので、独自のスクロール方法を実装できることです (First、Previous、Next、Last、または単に自分のスクロールバーは、関係ない)。
スクロールバーが表示されないように表示するアイテムの数を計算するにはどうすればよいですか?
ポップアップする 2 つの問題: - アプリケーションのサイズを変更すると、リストボックスのサイズが変わる可能性があります。
私がやろうとしていることを達成する方法はありますか?
EDIT(Martin Harrisへの返信として)
マーティン・ハリスが提案したコードの問題は、foreach ループが FrameworkElement を使用しているが、リストボックスが FrameworkElement から継承されないタイプの Book のオブジェクトで満たされていることであり、その高さを計算する他の手段もありません。ListBoxItem のルート要素はグリッドなので、このグリッドを取得することは可能かもしれませんが、その方法がわかりません。
リストボックス項目を表すために作成された実際の UI 要素を取得する方法はありますか?
編集
私が必要としていると思われるこのQ / Aを見つけました.. ItemContainerGenerator