5

私は次のリストボックスを持っています:

<ScrollViewer>
    <!--Spec Definitions-->
    <ListBox DataContext="{Binding SpecPackageSpecGroupListViewModel}" 
         VirtualizingStackPanel.IsVirtualizing="True" 
         VirtualizingStackPanel.VirtualizationMode="Recycling" 
         ScrollViewer.IsDeferredScrollingEnabled="True"
         ItemContainerStyle="{StaticResource SpecPackageSpecGroupListBoxStyle}" 
         ItemsSource="{Binding SortedChildren}" 
         Background="Transparent"
         BorderThickness="0" SelectionMode="Extended"
         Margin="5,5,5,5">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Controls:SpecPackageSpecGroupControl/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</ScrollViewer>

このリスト ボックスは最大 1000 個のアイテムをホストすることになっていますが、複雑なものです。VirtualizingStackPanel と連携させたいので、視覚化 XAML 構成を次のように設定しました。

VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Recycling" 

私の問題は、それが機能しないと思うことです-最初に-700個までのアイテムをロードするのに非常に長い時間がかかり、2番目に、コントロールコンストラクターでブレークポイントにヒットすると-700回呼び出されることがわかります:

public static int Counter = 0;

public SpecPackageSpecGroupControl()
{
    InitializeComponent();

    Counter++;
    if (Counter%100 == 0)
        Console.WriteLine("Hi");
}

Console.WriteLine("Hi") でブレーク ポイントを設定すると、静的カウンターが 700 に達したことがわかります。

したがって、これは仮想モードですが、基本的に UIElements が作成されています。

仮想化モードを誤解していますか、それとも何か間違っていますか?

4

1 に答える 1

9

それを ScrollViewer に入れないでください。貼り付けた XAML は確かに仮想化をバイパスしますが、別の理由で、ListBox は (スクロールせずに) 完全に拡張されます。完全に「拡張」されているため、ListBox は仮想化を使用しません。通常のコンテナ (Border、Grid など) に配置すると、組み込みのスクロール ビューアーが使用されます。

于 2010-09-14T17:01:52.943 に答える