/// <summary>
        /// Gets the items that are currently in the viewport
        /// of a LongListSelector and adds them
        /// into a list of weak references.
        /// </summary>
        /// <param name="list">
        /// The LongListSelector instance to search on.
        /// </param>
        /// <param name="items">
        /// The list of weak references where the items in 
        /// the viewport will be added.
        /// </param>
        public static void GetItemsInViewPort(LongListSelector list, IList<WeakReference> items)
        {
            DependencyObject child = list;

            if (VisualTreeHelper.GetChildrenCount(list) == 0)
            {
                // no child yet
                return;
            }

            list.UpdateLayout();

            do
            {
                child = VisualTreeHelper.GetChild(child, 0);
            } while (VisualTreeHelper.GetChildrenCount(child) > 0 && !(child is Canvas));

            if (child is Canvas && 
                VisualTreeHelper.GetChildrenCount(child) > 0 && 
                VisualTreeHelper.GetChild(child, 0) is Canvas)
            {
                Canvas headersPanel = (Canvas)child;
                Canvas itemsPanel = (Canvas)VisualTreeHelper.GetChild(child, 0);
                var itemsInList = new List<KeyValuePair<double, FrameworkElement>>();

                AddVisibileContainers(list, itemsPanel, itemsInList, /* selectContent = */ false);
                AddVisibileContainers(list, headersPanel, itemsInList, /* selectContent = */ true);

                foreach (var pair in itemsInList.OrderBy(selector => selector.Key))
                {
                    items.Add(new WeakReference(pair.Value));
                }
            }
        }
        /// <summary>
        /// Gets the items that are currently in the viewport
        /// of a LongListSelector and adds them
        /// into a list of weak references.
        /// </summary>
        /// <param name="list">
        /// The LongListSelector instance to search on.
        /// </param>
        /// <param name="items">
        /// The list of weak references where the items in
        /// the viewport will be added.
        /// </param>
        public static void GetItemsInViewPort(LongListSelector list, IList <WeakReference> items)
        {
            DependencyObject child = list;

            if (VisualTreeHelper.GetChildrenCount(list) == 0)
            {
                // no child yet
                return;
            }

            list.UpdateLayout();

            do
            {
                child = VisualTreeHelper.GetChild(child, 0);
            } while (VisualTreeHelper.GetChildrenCount(child) > 0 && !(child is Canvas));

            if (child is Canvas &&
                VisualTreeHelper.GetChildrenCount(child) > 0 &&
                VisualTreeHelper.GetChild(child, 0) is Canvas)
            {
                Canvas headersPanel = (Canvas)child;
                Canvas itemsPanel   = (Canvas)VisualTreeHelper.GetChild(child, 0);
                var    itemsInList  = new List <KeyValuePair <double, FrameworkElement> >();

                AddVisibileContainers(list, itemsPanel, itemsInList, /* selectContent = */ false);
                AddVisibileContainers(list, headersPanel, itemsInList, /* selectContent = */ true);

                foreach (var pair in itemsInList.OrderBy(selector => selector.Key))
                {
                    items.Add(new WeakReference(pair.Value));
                }
            }
        }
        /// <summary>
        /// Gets the items that are currently in the viewport of a
        /// <see cref="T:LongListSelector" /> and adds them into a list of weak references.
        /// </summary>
        /// <param name="list">
        /// The LongListSelector instance to search on.
        /// </param>
        /// <param name="items">
        /// The list of weak references where the items in
        /// the viewport will be added.
        /// </param>
        public static void GetItemsInViewPort(this LongListSelector list, IList <WeakReference> items)
        {
            DependencyObject child = list;
            int childCount;

            childCount = VisualTreeHelper.GetChildrenCount(list);
            if (childCount == 0)
            {
                // no child yet
                return;
            }

            list.UpdateLayout();

            Canvas headersPanel;

            do
            {
                child        = VisualTreeHelper.GetChild(child, 0);
                childCount   = VisualTreeHelper.GetChildrenCount(child);
                headersPanel = child as Canvas;
            } while ((headersPanel == null) && childCount > 0);

            if (headersPanel != null &&
                childCount > 0)
            {
                Canvas itemsPanel = VisualTreeHelper.GetChild(headersPanel, 0) as Canvas;
                if (itemsPanel != null)
                {
                    var itemsInList = new List <KeyValuePair <double, FrameworkElement> >();

                    AddVisibileContainers(list, itemsPanel, itemsInList, /* selectContent = */ false);
                    AddVisibileContainers(list, headersPanel, itemsInList, /* selectContent = */ true);

                    foreach (var pair in itemsInList.OrderBy(selector => selector.Key))
                    {
                        items.Add(new WeakReference(pair.Value));
                    }
                }
            }
        }