Загружать больше элементов в ListBox при прокрутке вниз - PullRequest
2 голосов
/ 31 марта 2012

У меня ListBox привязан к списку.Я хочу загрузить больше элементов при прокрутке вниз списка, чтобы отображалась анимация, указывающая на загрузку, и расширялся список привязок.Если я правильно понимаю, я могу использовать ObservableCollection вместо List и расширить эту коллекцию.Кроме того, я мог бы обернуть ItemPresenter в StackPanel с ItemPresenter и изображением внизу.

Но как мне определить, что список прокручен до самого дна, и инициировать расширение коллекции?

Ответы [ 3 ]

5 голосов
0 голосов
/ 03 октября 2013

Я использую следующий код для решения той же проблемы.В качестве базы я использую после решения n, добавил один DependecyProperties и удалил ссылки на сборку Microsoft.Practices.Prism.Interactivity.

public class ScrollViewMonitor
{
    public static readonly DependencyProperty ReachBottomCommandProperty = DependencyProperty.RegisterAttached("ReachBottomCommand",
                            typeof(ICommand), typeof(ScrollViewMonitor), new PropertyMetadata(null, ReachBottomCommandChanged));


    public static ICommand GetReachBottomCommand(DependencyObject dpObj)
    {
        return  (ICommand)dpObj.GetValue(ReachBottomCommandProperty);
    }

    public static void SetReachBottomCommand(DependencyObject dpObj, ICommand command)
    {
        dpObj.SetValue(ReachBottomCommandProperty, command);
    }

    private static FrameworkElement _frmElemenet;

    private static void ReachBottomCommandChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
       _frmElemenet = obj as FrameworkElement;

       if (_frmElemenet != null)
             _frmElemenet.Loaded += frmElement_Loaded;
    }


    public static readonly DependencyProperty VerticalOffsetProperty = DependencyProperty.RegisterAttached("VerticalOffset",
                            typeof(double), typeof(ScrollViewMonitor), new PropertyMetadata(0.0, VerticalOffsetChanged));

    private static void VerticalOffsetChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        ScrollViewer scrollView = (ScrollViewer)obj;

        if (scrollView.VerticalOffset > scrollView.ScrollableHeight * 0.8)
        {
            ICommand command = GetReachBottomCommand(_frmElemenet);

           if (command != null)
               command.Execute(null);
        }
    }

   private static void frmElement_Loaded(object sender, RoutedEventArgs e)
   {
       FrameworkElement frmElement = (FrameworkElement)sender;
       frmElement.Loaded -= frmElement_Loaded;

       var scrollView  = FindChildOfType<ScrollViewer>(frmElement);

       if (scrollView != null)
           scrollView.SetBinding(VerticalOffsetProperty, new Binding("VerticalOffset")
           {
               Source = scrollView
           }); 
   }


    private static T FindChildOfType<T>(DependencyObject obj) where T : class
    {
        Queue<DependencyObject> queue = new Queue<DependencyObject>();

        queue.Enqueue(obj); //Adds an object to the end of the

        while (queue.Count > 0)
        {
            DependencyObject current = queue.Dequeue(); //Removes and returns the object at the beginning of the Queue

            for (int i = 0, count = VisualTreeHelper.GetChildrenCount(current); i < count; i++)
            {
                DependencyObject dpObj = VisualTreeHelper.GetChild(current, 0);

                T typeChild = dpObj as T;
                if (typeChild != null)
                    return typeChild;

                queue.Enqueue(dpObj); //Adds an object to the end of the Queue
            }
        }

        return null;
    }
}

В XAML

       <ListBox x:Name="_lstBoxNews"
                     DataContext="{Binding Mode=OneTime}" 
                     ItemsSource="{Binding Items, Mode=OneWay}" 
                     ItemTemplate="{Binding Mode=OneWay, Source={StaticResource ShortArticleTemlate}}"
                     hlp:ScrollViewMonitor.ReachBottomCommand="{Binding LoadAdditionalArticles, Mode=OneTime}"
                     >
            </ListBox>
0 голосов
/ 09 апреля 2013

Я нашел это http://blogs.microsoft.co.il/blogs/shair/archive/2011/04/06/wp7-how-to-extend-listbox-when-reaching-last-item.aspx, на мой взгляд, более совпадающим, простым и понятным, чем другие примеры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...