Использование ISupportIncrementalLoading

Подгрузка элементов в списках — извечная проблема метро-разработчиков да и не только их. Многие просто пропускают эту проблему или же пишут расширения для списков, которые привязываются к ScrollViewer’y и отслуживают его движение и приближение к концу, и только некоторые используют данный интерфейс. Он поможет Вам решить извечную проблему подгрузок без лишних проблем и очень быстро.

В этой статье мы создадим пример приложения, чтобы увидеть, как мы можем использовать интерфейс ISupportIncrementalLoading, загружая элементы постепенно таким образом, что наш пользователь сможет прокручивать список бесконечно.

public interface ISupportIncrementalLoading
{ 
   bool HasMoreItems { get; }
   IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count);
}

У нас есть одно свойство и один метод в интерфейсе. Свойство HasMoreItems (на самом деле только его getter) мы будем использовать для проверки возможности подгрузки, чтобы загружать постепенно, и метод LoadMoreItemsAsync, где мы будет получать новые элементы и добавлять их в GridView или ListView. Также имейте в виду, что при выборке элементов мы вольны делать все, что угодно, так что вы можете добавить фильтры или делать другие операции по вашему усмотрению.

Хорошо, давайте начнем и создадим наше пустое приложение Windows Store в Visual Studio.

223

 

На стороне интерфейса у нас есть GridView для показа элементов и ProgressBar, что бы показывать процесс загрузки элементов:

 <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
   <GridView x:Name="GridViewMain" Margin="0,100,0,0" Padding="100,0,0,10">
       <GridView.Resources>
           <DataTemplate x:Key="DataTemplateGridViewMain">
               <Grid Width="100" Height="100" Background="#FF7C1A9B">
                   <TextBlock Text="{Binding}" VerticalAlignment="Center" FontSize="20" FontFamily="Tempus Sans ITC" TextAlignment="Center"/>
               </Grid>
           </DataTemplate>
       </GridView.Resources>
       <GridView.ItemTemplate>
           <StaticResource ResourceKey="DataTemplateGridViewMain"/>
       </GridView.ItemTemplate>
   </GridView>
   <ProgressBar x:Name="ProgressBar" Height="10" Margin="0,5,0,0" VerticalAlignment="Top" Visibility="Collapsed"/>
</Grid>

Для того чтобы использовать интерфейс ISupportIncrementalLoading мы изменим логику загрузки наших элементов. Вместо заполнения списка или ObservableCollection и установки ее в ItemsSource GridView, мы создадим класс, который реализует ObservableCollection и ISupportIncrementalLoading, и обрабатывает логику, и установим экземпляр этого класса в ItemsSource GridView. Этот класс будет выглядеть следующим образом:

 using System.Collections.ObjectModel;
using Windows.UI.Core;
using System.Threading.Tasks;
public class ItemsToShow : ObservableCollection<string>, ISupportIncrementalLoading
{
   public int lastItem = 1;

   public bool HasMoreItems
   {
       get
       {
           if (lastItem == 10000)
           {
               return false;
           }
           else
           {
               return true;
           }
       }
   }

   public IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count)
   {
       ProgressBar progressBar = ((Window.Current.Content as Frame).Content as MainPage).ProgressBar;

       CoreDispatcher coreDispatcher = Window.Current.Dispatcher;

       return Task.Run<LoadMoreItemsResult>(async () =>
           {
               await coreDispatcher.RunAsync(CoreDispatcherPriority.Normal,
                   () =>
                   {
                       progressBar.IsIndeterminate = true;
                       progressBar.Visibility = Visibility.Visible;
                   });

               List<string> items = new List<string>();
               for (int i = 0; i < count; i++)
               {
                   items.Add(String.Format("Item {0}", lastItem));
                   lastItem++;
                   if (lastItem == 10000)
                   {
                       break;
                   }
               }

               await coreDispatcher.RunAsync(CoreDispatcherPriority.Normal,
                   () =>
                   {
                       foreach (string item in items)
                       {
                           this.Add(item);
                       }
                       progressBar.Visibility = Visibility.Collapsed;
                       progressBar.IsIndeterminate = false;
                   });

               return new LoadMoreItemsResult() { Count = count };
           }).AsAsyncOperation<LoadMoreItemsResult>();
   }
}

Здесь мы определили количество элементов, а именно 9999 пунктов, начинающиеся с 1 и будем возвращать false в случае превышения этого количества. В LoadMoreItemsAsync мы асинхронно заполняем наш ObservableCollection. Имейте в виду, что любое действие, которое требует от нас манипулирование интерфейсом должно запускаться в CoreDispatcher, потому как этот асинхронный код будет работать в другом потоке и мы получим исключение, если мы попытаемся достучаться к UI из любого места помимо потока пользовательского интерфейса.

Последнее, что нам нужно сделать, это установить ItemsSource в GridView к экземпляру нашего класса:

public MainPage()
{
   this.InitializeComponent();
   this.Loaded += MainPage_Loaded;
}

void MainPage_Loaded(object sender, RoutedEventArgs e)
{
   GridViewMain.ItemsSource = new ItemsToShow();
}

Ну, хорошо, давайте запустим приложение и попробуем прокрутить вправо весь список до появления элемента номер 9999. Посмотрите на размер полосы прокрутки в GridView в нижней части страницы, когда количество элементов возрастет (на последующих скриншотах).

322

422521618

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

Не правда ли это значительно упрощает подгрузку элементов в метро приложениях?:)

Ссылка на источник: INFINITE SCROLLING IN WINDOWS STORE APPS USING ISUPPORTINCREMENTALLOADING

Реклама
Tagged with: , , , , , ,
Опубликовано в Development, Windows 8.1
5 comments on “Использование ISupportIncrementalLoading
  1. Wonderful blog! Do you have any hints for aspiring writers?
    I’m planning to start my own site soon but I’m a little lost on everything.

    Would you recommend starting with a free platform
    like WordPress or go for a paid option? There are so many choices out there that I’m totally overwhelmed ..
    Any tips? Many thanks!

  2. Hello! This is my 1st comment here so I just wanted to give a quick shout out and say I
    truly enjoy reading through your posts. Can you recommend
    any other blogs/websites/forums that cover the same topics?

    Thanks a lot!

  3. Pretty nice post. I simply stumbled upon your weblog and
    wished to mention that I have truly enjoyed browsing your blog posts.
    In any case I will be subscribing in your feed and I’m hoping you write again very soon!

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: