MeasureOverrideが最も時間のかかる操作であることを確認することしかできません。 (そして、それを見つけるためにプロファイラは必要ありません)なぜ私はそれがずっと長くかかるのか推測できます。
まず、MeasureOverrideはListBoxItemのビジュアルツリーを再帰的に移動します。このコールチェーンの終わりには、おそらく実際のサイズを返すネイティブコードへの呼び出しがあります。
したがって、単純なアイテム構造を維持することが最も重要です。
あなたの構造は複雑すぎるようです。 TextBoxテンプレートを見ると、その構造がGrid> Border> ContentPresenterであることがわかります。私はあなたのコードを知らないので、ContentPresenterの背後にあるものは判断できません。なぜTextBlockを使用しないのでしょうか(可能な場合) - これはずっと効率的です。
実験として、私はMyListBoxItem.MeasureOverrideを実装し、ベース実装を呼び出さずに固定サイズを返そうとします。私はそれが動作するかどうかは分かりませんが、それは驚くべき結果をもたらす可能性があります。
独自のリスト項目を実装する際に調査してもよい2番目のことは、MeasureOverride呼び出しの頻度です。 (または単にプロファイラの出力を見てください)。コールの数が多すぎると、レイアウトが必要以上にループすることがあります。おそらく、解決するためにいくつかのステップが必要ないくつかの相反するサイジング要件があります。
あなたは40項目を挙げています。それは何の役にも立たないはずです。 ListBoxは3つの画面のListBoxItemを構築し、残りの項目は必要に応じて構築(ほとんどの場合再利用)されます。項目数を増やして測定時間が増える場合は、データの実装で問題がないかどうかを調べます。
ありがとうございますが、データはローカルで計算されており、問題が発生するのはわずか数msで済みます。私は実際に法案問題に関するいくつかのアイデアを聞きたいと思います – Miro
私は含まれているリンクの推奨事項に従っていますか?私は一般的にそれらのものに従って、まだ私の2つの提出されたアプリで大きな問題を抱えていません。 –
さて、ここ数ヶ月間、私は多くの提案を見てきましたが、成功していませんでした。サイズは固定されており、データはダウンロードされていませんし、いくつかの項目(約40のリストボックス項目)があります。依然として測定するフェイズは理にかなっています。 – Miro