public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();

            if (_innerSelector != null)
            {
                _innerSelector.ItemRealized -= _innerSelector_ItemRealized;
                _innerSelector.ItemUnrealized -= _innerSelector_ItemUnrealized;
                _innerSelector.JumpListClosed -= _innerSelector_JumpListClosed;
                _innerSelector.JumpListOpening -= _innerSelector_JumpListOpening;
                _innerSelector.ManipulationStateChanged -= _innerSelector_ManipulationStateChanged;
                _innerSelector.PropertyChanged -= _innerSelector_PropertyChanged;
                _innerSelector.SelectionChanged -= _innerSelector_SelectionChanged;
                _innerSelector.MouseMove -= _innerSelector_MouseMove;
                _innerSelector.MouseLeave -= _innerSelector_MouseLeave;
            }
            _innerSelector = this.GetTemplateChild(InnerSelectorName) as LongListSelector;
            if (_innerSelector != null)
            {
                _innerSelector.LayoutMode = LayoutMode;
                _innerSelector.SelectedItem = SelectedItem;
                _innerSelector.ItemRealized += _innerSelector_ItemRealized;
                _innerSelector.ItemUnrealized += _innerSelector_ItemUnrealized;
                _innerSelector.JumpListClosed += _innerSelector_JumpListClosed;
                _innerSelector.JumpListOpening += _innerSelector_JumpListOpening;
                _innerSelector.ManipulationStateChanged += _innerSelector_ManipulationStateChanged;
                _innerSelector.PropertyChanged += _innerSelector_PropertyChanged;
                _innerSelector.SelectionChanged += _innerSelector_SelectionChanged;
                _innerSelector.MouseMove += _innerSelector_MouseMove;
                _innerSelector.MouseLeave += _innerSelector_MouseLeave;

                _viewportControl = _innerSelector.GetFirstLogicalChildByType<ViewportControl>(true);
                _prepareRefreshDataTemplate = _innerSelector.Resources["PrepareRefreshDataTemplate"] as DataTemplate;
                _refreshingDataTemplate = _innerSelector.Resources["RefreshingDataTemplate"] as DataTemplate;
            }
        }
        /// <summary>
        /// Returns the set of weak references to the items
        /// that must be animated.
        /// </summary>
        /// <returns>
        /// A set of weak references to items sorted by their feathering index.
        /// </returns>
        private static IList <WeakReference> GetTargetsToAnimate()
        {
            List <WeakReference>  references;
            List <WeakReference>  targets = new List <WeakReference>();
            PhoneApplicationPage  page    = null;
            PhoneApplicationFrame frame   = Application.Current.RootVisual as PhoneApplicationFrame;

            if (frame != null)
            {
                page = frame.Content as PhoneApplicationPage;
            }

            if (page == null)
            {
                return(null);
            }

            if (!_pagesToReferences.TryGetValue(page, out references))
            {
                return(null);
            }

            foreach (WeakReference r in references)
            {
                FrameworkElement target = r.Target as FrameworkElement;

                // If target is null, skip.
                if (target == null)
                {
                    continue;
                }

                // If target is not on the screen, skip.
                if (!IsOnScreen(target))
                {
                    continue;
                }

                ListBox          listBox          = r.Target as ListBox;
                LongListSelector longListSelector = r.Target as LongListSelector;
                Pivot            pivot            = r.Target as Pivot;

                if (listBox != null)
                {
                    // If the target is a ListBox, feather its items individually.
                    listBox.GetItemsInViewPort(targets);
                }
                else if (longListSelector != null)
                {
#if WP7
                    // If the target is a LongListSelector, feather its items individually.
                    ListBox child = longListSelector.GetFirstLogicalChildByType <ListBox>(false);

                    if (child != null)
                    {
                        child.GetItemsInViewPort(targets);
                    }
#else
                    longListSelector.GetItemsInViewPort(targets);
#endif
                }
                else if (pivot != null)
                {
                    // If the target is a Pivot, feather the title and the headers individually.
                    ContentPresenter title = pivot.GetFirstLogicalChildByType <ContentPresenter>(false);

                    if (title != null)
                    {
                        targets.Add(new WeakReference(title));
                    }

                    PivotHeadersControl headers = pivot.GetFirstLogicalChildByType <PivotHeadersControl>(false);

                    if (headers != null)
                    {
                        targets.Add(new WeakReference(headers));
                    }
                }
                else
                {
                    // Else, feather the target as a whole.
                    targets.Add(r);
                }
            }

            return(targets);
        }