2

次のようなアイテムパネルとして、VirtualizingStackPanelを備えたItemsControlがあります。

<ItemsControl Style="{StaticResource ItemsControl}" Name="itemsControl" 
              Margin="0,100,0,0" HorizontalAlignment="Stretch" Height="80">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <TextBox  />                    
            </DataTemplate>
        </ItemsControl.ItemTemplate>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>                    
                <VirtualizingStackPanel Orientation="Horizontal" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
</ItemsControl>

スタイルは次のとおりです。

<Style x:Key="ItemsControl" TargetType="ItemsControl">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ItemsControl">
                <ScrollViewer VerticalScrollBarVisibility="Hidden" 
                              HorizontalScrollBarVisibility="Visible">
                    <ItemsPresenter />
                </ScrollViewer>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

ItemsSourceとして100.000要素のコレクションを設定すると、非常に優れたパフォーマンスが得られます。1つを除いてすべてが大丈夫です。テキストボックスの1つにテキストを入力してからスクロールを開始すると、そのテキストがリスト全体に表示されていることがわかります。

VirtualizingStackPanelの機能を理解しています。スクロールすると表示される要素を継続的に読み込んでいます。仮想化手法のいくつかの側面は理解していますが、この奇妙な動作を理解する方法がわかりません。WPF / Silverlight仮想化に関する適切なドキュメントが見つからなかったので、何が起こっているのか説明してください

4

2 に答える 2

6

VirtualizingStackPanel実際には要素を継続的にロードしません。代わりに、既存の要素(コントロール)を再利用し、その背後にあるDataContextを置き換えるだけです。

したがって、VirtualizingStackPanel100,000個のアイテムがあり、一度に10個しか表示されない場合、通常は約14個のアイテム(スクロールバッファー用の追加アイテム)がレンダリングされます。スクロールすると、これらの14個のコントロールの背後にあるDataContextが変更されますが、実際のコントロール自体が置き換えられることはありません。

TextBox#1にTextを入力するようなことをしTextBox.Text、それが何にもバインドされていない場合、コントロールが再利用されるため、Textは常に表示されます。を値にバインドするTextBox.Textと、スクロール時にDataContextが変更され、表示されたテキストが置き換えられます。

于 2011-10-04T14:16:08.927 に答える
0

VirtualizingStackPanelで直接リサイクルをオフにする方法はわかりませんが、これはListBoxの構文です。コメントとして投稿したかったのですが、フォーマットされたコードが欲しかったのです。

   <ListBox VirtualizingStackPanel.VirtualizationMode="Standard" />
于 2011-10-04T14:36:21.617 に答える