Many of you might have been in  a situation when you desperately wanted to know if a scroll bar is scrolling or not.
Currently there is no direct provision to attain this in WP7. I'll walk through the code which will help you to identify if a list is scrolling or not. Later at the end there ia a full working sample attached.
My sample is straight forward. I'll be changing the page title to "Scrolling" when we scroll the list and "NotScrolling" while it is stationary.
We have a list called theList.
1. Now attach a Loaded event to the page constructor:
2. Define a variable to identify if ScrollEvent has been hooked already:
3. Define MainPage_Loaded handler. All major work will be done here:
4. Use this helper function to identify the first visual child (ScrollViewer):
5. Actual even handler which identify a changed state for scrollviewer:
6. Helper function to filter out the required VisualState:
      
7. Another helper function to fill the data in list to demonstrate implementation:
      
Source Code
Currently there is no direct provision to attain this in WP7. I'll walk through the code which will help you to identify if a list is scrolling or not. Later at the end there ia a full working sample attached.
My sample is straight forward. I'll be changing the page title to "Scrolling" when we scroll the list and "NotScrolling" while it is stationary.
We have a list called theList.
1. Now attach a Loaded event to the page constructor:
public MainPage()
{
    InitializeComponent();
    Loaded += new RoutedEventHandler(MainPage_Loaded);
    theList.ItemsSource = GetListData(60);
}2. Define a variable to identify if ScrollEvent has been hooked already:
bool alreadyHookedScrollEvents = false;3. Define MainPage_Loaded handler. All major work will be done here:
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    if (alreadyHookedScrollEvents)
        return;
    alreadyHookedScrollEvents = true;
    //This is the key player which holds the magic for this trick
    //This ScrollViewer is the first templated child of your List
    ScrollViewer viewer = FindSimpleVisualChild<ScrollViewer>(theList);
    if (viewer != null)
    {
        // Visual States are always on the first child of the control template 
        FrameworkElement element = VisualTreeHelper.GetChild(viewer, 0) as FrameworkElement;
        if (element != null)
        {
            VisualStateGroup group = FindVisualState(element, "ScrollStates");
            if (group != null)
            {
                group.CurrentStateChanging += group_CurrentStateChanging;
            }
        }
    }
}4. Use this helper function to identify the first visual child (ScrollViewer):
T FindSimpleVisualChild<T>(DependencyObject element) where T : class
{
    while (element != null)
    {
        if (element is T)
            return element as T;
        element = VisualTreeHelper.GetChild(element, 0);
    }
    return null;
}5. Actual even handler which identify a changed state for scrollviewer:
void group_CurrentStateChanging(object sender, VisualStateChangedEventArgs e)
{
    //for demonstration change page's title
    PageTitle.Text = e.NewState.Name;
}6. Helper function to filter out the required VisualState:
VisualStateGroup FindVisualState(FrameworkElement element, string name)
{
    if (element == null)
        return null;
    IList<VisualStateGroup> groups = (IList<VisualStateGroup>)VisualStateManager.GetVisualStateGroups(element);
    foreach (VisualStateGroup group in groups)
        if (group.Name == name)
            return group;
    return null;
}7. Another helper function to fill the data in list to demonstrate implementation:
ObservableCollection<int> GetListData(int count)
{
    sourceList = new ObservableCollection<int>();
    for (int i = 1; i <= count; i++)
    {
        sourceList.Add(i);
    }
    return sourceList;
}Source Code
 
No comments:
Post a Comment