2

この記事で紹介した通常のコントロールと同様の階層コントロールの仮想化コレクションを実装しようとしています。

この記事で紹介されている解決策は、(記事からの)次の動作に大きく依存しています。

が実装ではなく実装にItemsControlバインドされている場合、リスト全体を列挙するのではなく、表示に必要なアイテムにのみアクセスします。プロパティを使用し てコレクションのサイズを決定し、おそらくスクロール範囲を設定します。次に、リストインデクサーを使用して画面上のアイテムを繰り返し処理します。したがって、 多数のアイテムがあることをレポートできるが、実際には必要な場合にのみアイテムを取得できるを作成することができます。IListIEnumerableCountIList

ListBoxこの動作をしている間TreeView(これもItemsControl)はこのように動作せず、画面に表示されているかどうかに関係なく、すべてのアイテムが常に要求されていることがわかりました。

それで、これはすべてに固有の動作でListBoxあり、すべてに固有の動作ではありませんか、それともItemsControlWPFのバグTreeViewですか?

また、MSDNでこの動作についての言及を見つけることができなかったので、誰かがそれについて文書化されているのを見つけたら、私はそれについて知りたいと思います。

4

1 に答える 1

0

または の設定ItemsControlを使用するだけでなく、仮想化することができますVirtualizingStackPanelVirtualizingStackPanel.IsVirtualizing="True"

必要なコードの重要な部分は次のとおりですが、より完全な回答については、この質問を参照してください

<ItemsControl
    VirtualizingStackPanel.IsVirtualizing="True" <!-- needed -->
    ScrollViewer.CanContentScroll="True" <!-- needed -->
    ... >
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel /> <!-- needed -->
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.Template>
        <ControlTemplate>
            <ScrollViewer>  <!-- needed -->
                <ItemsPresenter  />
            </ScrollViewer>
        </ControlTemplate>
    </ItemsControl.Template>
</ItemsControl>
于 2012-07-23T18:53:19.037 に答える