Click here to Skip to main content
Click here to Skip to main content
Add your own
alternative version

Clearer – A Gesture-Driven Windows 8 To-Do Application

, 9 Oct 2012 CPOL
This article describes my experiences of porting a novel gesture-driven Windows Phone app to Windows 8.
using System.Linq;
using System.Collections.Generic;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml;
using LinqToVisualTree;

namespace ClearStyle
{
  public static class ItemsControlExtensions
  {
    /// <summary>
    /// Enumerates all the items that are currently visible in an ItemsControl. This
    /// implementation works for both virtualized and non-virtualized panels.
    /// </summary>
    public static IEnumerable<FrameworkElement> GetItemsInView(this ItemsControl itemsControl)
    {
      // find the panel that hosts our items - this is 'cached'
      // using the ItemsControl.Tag property to minimize visual tree
      // navigation
      Panel itemsHostPanel = itemsControl.Tag as Panel;
      if (itemsHostPanel == null)
      {
        itemsHostPanel = itemsControl.Descendants<Panel>()
                                    .Cast<Panel>()
                                    .Where(p => p.IsItemsHost)
                                    .SingleOrDefault();
        itemsControl.Tag = itemsHostPanel;
      }

      VirtualizingStackPanel vsp = itemsHostPanel as VirtualizingStackPanel;
      if (vsp != null)
      {
        // implementation for virtualizing lists
        return GetItemsInView(itemsControl, vsp);
      }
      else
      {
        // implementation for non-virtualizing lists
        return Enumerable.Range(0, itemsControl.Items.Count)
                      .Select(index => itemsControl.ItemContainerGenerator.ContainerFromIndex(index))
                      .Cast<FrameworkElement>()
                      .Where(container => container.GetRelativePosition(itemsControl).Y + container.ActualHeight > 0)
                      .Where(container => container.GetRelativePosition(itemsControl).Y - container.ActualHeight < itemsControl.ActualHeight);
      }
    }

    /// <summary>
    /// Gets the items in view for a virtualizing list
    /// </summary>
    private static IEnumerable<FrameworkElement> GetItemsInView(this ItemsControl itemsControl, VirtualizingStackPanel vsp)
    {
      // iterate over each of the items in view
      int firstVisibleItem = (int)vsp.VerticalOffset;
      int visibleItemCount = (int)vsp.ViewportHeight;
      for (int index = firstVisibleItem; index <= firstVisibleItem + visibleItemCount + 3; index++)
      {
        var item = itemsControl.ItemContainerGenerator.ContainerFromIndex(index) as FrameworkElement;
        if (item == null)
          continue;

        yield return item;
      }
    }

  }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Colin Eberhardt
Architect Scott Logic
United Kingdom United Kingdom
I am CTO at ShinobiControls, a team of iOS developers who are carefully crafting iOS charts, grids and controls for making your applications awesome.
 
I am a Technical Architect for Visiblox which have developed the world's fastest WPF / Silverlight and WP7 charts.
 
I am also a Technical Evangelist at Scott Logic, a provider of bespoke financial software and consultancy for the retail and investment banking, stockbroking, asset management and hedge fund communities.
 
Visit my blog - Colin Eberhardt's Adventures in .NET.
 
Follow me on Twitter - @ColinEberhardt
 
-
Follow on   Twitter   Google+

| Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.1411022.1 | Last Updated 10 Oct 2012
Article Copyright 2012 by Colin Eberhardt
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid