ほとんどのWPF開発者が知っているように、ScrollViewer.CanContentScroll
をfalse
に設定すると仮想化が無効になります。 ScrollViewer.CanContentScroll
をfalse
に設定しながら仮想化を有効にしようとするので、それがどのように機能するか知りたいのですが。
「ScrollViewerは現在、2つのスクロールモードを許可しています。滑らかなピクセルごとのスクロール(CanContentScroll = false)または個別のアイテムごとのスクロール(CanContentScroll = true)です。現在、WPFは、アイテムごとにスクロールする場合にのみUI仮想化をサポートしています。ピクセルベースのスクロールは「物理スクロール」とも呼ばれ、アイテムベースのスクロールは「論理スクロール」とも呼ばれます。
仮想化には、現在表示されている論理ユニット(アイテム)を追跡できるように、アイテムベースのスクロールが必要です... ScrollViewerをピクセルベースのスクロールに設定すると、ロジックユニットの概念はなくなり、ピクセルのみになります!!!
この制限を回避する方法はあるかとよく尋ねられます。まあ、何でも可能ですが、簡単な回避策はありません。ピクセルベースのスクロールとUI仮想化を組み合わせるには、現在の仮想化ロジックの重要な部分を再実装する必要があります。また、それに伴ういくつかの興味深い問題を解決する必要があります。たとえば、アイテムコンテナーの高さが異なる場合、つまみのサイズをどのように計算しますか? (仮想化されたコンテナーの高さがわからないことに注意してください。現在表示されているコンテナーの高さしかわかりません。)知っている高さに基づいて平均を仮定するか、またはアイテムがメモリに読み込まれるときのアイテムの高さ(ユーザーがコントロールを操作するときにサムサイズの精度が向上します)。ピクセルベースのスクロールが同じ高さのアイテムでのみ機能するように決定することもできます–これにより、ソリューションが簡素化されます。したがって、はい、この制限を回避するための解決策を考え出すことができますが、それは簡単なことではありません。