Более точная альтернатива LongListSelector.ItemRealized

Я пытаюсь добавить двусторонний (вверх и вниз) бесконечный список прокрутки в мое приложение WP8. Поэтому, когда список достигает вершины, мы загружаем «меньшие» элементы из веб-API, а когда список достигает конца, мы загружаем «большие» элементы из веб-API.

Моя первоначальная идея состояла в том, чтобы использовать список, подобный этому, верхний и нижний колонтитулы устанавливаются поверх экрана.

        <phone:LongListSelector x:Name="List" ItemsSource="{Binding Routes}" Margin="0,0,0,-90" ItemRealized="listBox_ItemRealized">
            <phone:LongListSelector.ListHeader>
                <Grid Margin="12,-90,12,30" Height="60" VerticalAlignment="Top">
                    <StackPanel VerticalAlignment="Center">
                        <TextBlock Text="Load more" />
                    </StackPanel>
                </Grid>
            </phone:LongListSelector.ListHeader>

            <phone:LongListSelector.ListFooter>
                <Grid Margin="12,30,12,0" Height="60" VerticalAlignment="Bottom">
                    <StackPanel VerticalAlignment="Center">
                        <TextBlock Text="Load more" />
                    </StackPanel>
                </Grid>
            </phone:LongListSelector.ListFooter>

            <phone:LongListSelector.ItemTemplate>
                <DataTemplate>
                    <StackPanel Margin="12,8" Background="#FFd3dae8" Width="456">
                        <TextBlock Text="{Binding item}" />
                    </StackPanel>
                </DataTemplate>
            </phone:LongListSelector.ItemTemplate>
        </phone:LongListSelector>



    void listBox_ItemRealized(object sender, ItemRealizationEventArgs e)
    {
        if (e.ItemKind == LongListSelectorItemKind.ListHeader)
        {
            // Get smaller items
        }

        else if (e.ItemKind == LongListSelectorItemKind.ListFooter)
        {
            // Get bigger items
        }
    }

Затем я могу использовать ListBox.ItemRealized, чтобы проверить, когда реализуется верхний или нижний колонтитул, и загрузить дополнительные данные на основе этого.

Проблема в том, что я могу получить только 5 элементов из веб-апи одновременно, поэтому изначально список содержит 5 элементов. Это нормально, список выходит на экран, так как мой шаблон элемента списка на самом деле довольно большой, и на самом деле не видны ни нижний колонтитул, ни верхний колонтитул.

Но событие ItemRealized вызывается для каждого элемента, даже если они на самом деле не видны. Я думаю, проблема в том, что LongListSelector фактически загружает 10 (?) Элементов одновременно и поднимает ItemRealized для всех из них?

Существуют ли какие-либо другие методы, которые я могу использовать для достижения такой функциональности?


person devha    schedule 12.02.2014    source источник


Ответы (1)


Вы используете лучший подход. LLS будет «реализовывать» (создавать/рендерить) элементы до того, как они потребуются. Это хорошая вещь. Если бы ему пришлось реализовывать их в тот момент, когда они появлялись на экране, вы бы столкнулись с огромной проблемой производительности.

Когда ваши предметы реализованы, вы можете добавить больше предметов. Продолжайте делать это до тех пор, пока элементы больше не реализуются.

Я бы предложил получить более пяти элементов, так как это очень мало результатов для получения с сервера.

person Shawn Kendrot    schedule 13.02.2014
comment
В этом случае пользователю обычно достаточно 5 пунктов в списке. Но было бы здорово, если бы пользователь мог просто прокручивать вверх/вниз, чтобы получить больше результатов. Совершенно не зависит от меня, что я получаю только пять предметов с сервера одновременно. Конечно, я могу сделать несколько запросов, чтобы получить больше предметов... - person devha; 13.02.2014
comment
То, что я действительно ищу, - это решение, в котором я могу точно проверить, когда список (Listbox или longlistselector) попадает вверх или вниз. Затем я могу сделать веб-запрос и получить больше элементов. - person devha; 13.02.2014
comment
Вы можете подключиться к ViewportControl, как это сделано в этот пост - person Shawn Kendrot; 13.02.2014