Виртуализация данных ListBox не вступает в силу - PullRequest
4 голосов
/ 16 сентября 2011

У меня было 1000 элементов из xml и я загрузил их в объект List. Список привязан к ListBox, который горизонтально ориентирован, поэтому пользователь может пролистывать элементы слева направо или справа налево. Поскольку количество элементов огромно, мое приложение закрывалось, вероятно, из-за чрезмерного использования памяти. Если бы я уменьшил количество предметов до 50, это сработало.

Я нашел эту статью http://shawnoster.com/blog/post/Improving-ListBox-Performance-in-Silverlight-for-Windows-Phone-7-Data-Virtualization.aspx

, а затем эта статья о виртуализации данных

http://blogs.msdn.com/b/ptorr/archive/2010/08/16/virtualizing-data-in-windows-phone-7-silverlight-applications.aspx

После реализации виртуализированного класса, реализующего IList, я не вижу разницы. This [] (ниже) вызывается еще 1000 раз, хотя я ожидал, что он будет вызываться только 30-40 раз, поскольку я понимаю, что пользовательский интерфейс уже виртуализирован в Listbox. Почему не работает виртуализация?

object IList.this[int index]
{
    get
    {
        if (index >= cachedItems.Count)
        {
            //replenish cache code here
        }

        return cachedItems[index];
    }
    set
    {
        throw new NotImplementedException();
    }
}

Вот часть XAML, относящаяся к проблеме. Надеюсь, что это дает полную картину кода. Не уверен, что Width=Auto имеет какое-либо отношение к этому, но я не могу изменить его, иначе мое перелистывание прекращается.

<ScrollViewer HorizontalScrollBarVisibility="Auto" Margin="0,0,0,0" Width="auto" x:Name="WordsScrollview" Opacity="1"  Grid.Row="1" RenderTransformOrigin="0.5,0.5">

    <ListBox x:Name="horizontalListBox" Width="auto" Height="Auto" >

        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal">
                </StackPanel>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>

        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Width="430" Text="{Binding Word}"  TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}" TextAlignment="Center" />
                    <Image Height="290" HorizontalAlignment="Center" Name="image1" Stretch="Fill"  Width="430" Source="{Binding ImageFile}" Margin="10,50,10,0" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>

        <ListBox.Background>
            <SolidColorBrush />
        </ListBox.Background>

    </ListBox>

</ScrollViewer>

Ответы [ 2 ]

3 голосов
/ 18 сентября 2011

Вот XAML, который заставляет виртуализацию пользовательского интерфейса, наконец, запустить.

        <ListBox x:Name="horizontalListBox"   Height="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" >

                <ListBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <VirtualizingStackPanel Orientation="Horizontal">

                        </VirtualizingStackPanel>
                    </ItemsPanelTemplate>
                </ListBox.ItemsPanel>
                <ListBox.ItemTemplate>
                    <DataTemplate>

                            <StackPanel>
                                <TextBlock Width="430" Text="{Binding Word}"  TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}" TextAlignment="Center" />

                                <Image Height="290" HorizontalAlignment="Center" Name="image1" Stretch="Fill"  Width="430" Source="{Binding ImageFile}" Margin="10,50,10,0" />
                               </StackPanel>

                    </DataTemplate>
                </ListBox.ItemTemplate>
                <ListBox.Background>
                    <SolidColorBrush />
                </ListBox.Background>
            </ListBox>
0 голосов
/ 25 июня 2015

в следующей статье объясняется, что оборачивание виртуализированного элемента управления UI в ScrollViewer даст ему бесконечное пространство, эффективно отключая виртуализацию UI

http://blogs.msdn.com/b/mcsuksoldev/archive/2010/04/13/performance-characteristics-of-the-silverlight-datagrid.aspx

...