Ejemplo n.º 1
0
        /// <summary>
        /// Fired when the view has changed. Update who is in and who isn't in the ViewPort.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void UpdateWhoIsInViewPort()
        {
            // What is the view port in the child's cooredinates.
            var viewport = new Rect(new Point(_host.HorizontalOffset, _host.VerticalOffset), new Point(_host.HorizontalOffset + _host.RenderSize.Width, _host.VerticalOffset + _host.RenderSize.Height));

            // Go through everything owned by the scroll bar's panel, and set it.
            // Normally a content presenter holds just one item, but a DataTemplate (or other) could have multiple,
            // so we will be sure to support all children of the content presenter.
            _itemContainer = (_host.Content as ItemsControl);
            int itemCount = _itemContainer.Items.Count;
            var inframe   = from index in Enumerable.Range(0, itemCount)
                            let container = _itemContainer.ContainerFromIndex(index) as ContentPresenter
                                            let inFrame = isInFrame(viewport, container)
                                                          select Tuple.Create(container, inFrame);

            // We want to turn on a few for a buffer as well.
            var initialList    = inframe.TakeWhile(t => t.Item2 == false);
            var inViewPortList = inframe.Where(t => t.Item2);
            var tailList       = inframe.SkipWhile(t => t.Item2 == false).Where(t => t.Item2 == false);

            var nbuf = initialList.Count() - ItemsWaitingInTheWings;

            if (nbuf > 0)
            {
                initialList = initialList.Take(nbuf)
                              .Concat(initialList.Skip(nbuf).Select(t => Tuple.Create(t.Item1, true)));
            }

            tailList =
                tailList.Take(ItemsWaitingInTheWings).Select(t => Tuple.Create(t.Item1, true))
                .Concat(tailList.Skip(ItemsWaitingInTheWings));

            inframe = initialList.Concat(inViewPortList).Concat(tailList);

            // Ok - and finally issue a "set" for all the visual elements in the scrolling view.
            var allToSet = from p in inframe
                           let cnt = VisualTreeHelper.GetChildrenCount(p.Item1)
                                     from childIndex in Enumerable.Range(0, cnt)
                                     let child = VisualTreeHelper.GetChild(p.Item1, childIndex) as UIElement
                                                 where (child != null)
                                                 select Tuple.Create(child, p.Item2);

            foreach (var frameInfo in allToSet)
            {
                _updateFunction(frameInfo.Item1, frameInfo.Item2);
            }
        }
Ejemplo n.º 2
0
        public static IEnumerable <FrameworkElement> GetItemsInView(this ItemsControl itemsControl)
        {
            VirtualizingStackPanel vsp = GetChild <VirtualizingStackPanel>(itemsControl);

            int firstVisibleItem = (int)vsp.VerticalOffset;
            int visibleItemCount = (int)vsp.ViewportHeight;

            for (int index = firstVisibleItem; index <= firstVisibleItem + visibleItemCount + 1; index++)
            {
                var item = itemsControl.ContainerFromIndex(index) as FrameworkElement;
                if (item == null)
                {
                    continue;
                }

                yield return(item);
            }
        }
        public static async Task AnimateItems(this ItemsControl itemsControl, AnimationDefinition animationDefinition, double itemDelay = 0.05)
        {
            if (itemsControl == null)
            {
                return;
            }
            if (animationDefinition == null)
            {
                return;
            }
            if (itemDelay <= 0.0)
            {
                itemDelay = 0.05;
            }

            itemsControl.UpdateLayout();

            var animations = new List <Task>();

            double baseDelay = animationDefinition.Delay;

            for (int index = 0; index < itemsControl.Items.Count; index++)
            {
#if NETFX_CORE || WINDOWS_81_PORTABLE
                var container = (FrameworkElement)itemsControl.ContainerFromIndex(index);
#endif
#if WINDOWS_PHONE
                var container = (FrameworkElement)itemsControl.ItemContainerGenerator.ContainerFromIndex(index);
#endif
                if (container == null)
                {
                    continue;
                }

                animationDefinition.Delay = baseDelay + (itemDelay * index);
                AnimationManager.ClearAnimationProperties(container);
                animations.Add(
                    container.AnimateAsync(animationDefinition));
            }

            animationDefinition.Delay = baseDelay;

            await Task.WhenAll(animations.ToArray());
        }
Ejemplo n.º 4
0
        public static IEnumerable <object> GetVisibleItems(ItemsControl itemsControl)
        {
            for (int i = 0; i < itemsControl.Items.Count; i++)
            {
                var obj = itemsControl.ContainerFromIndex(i) as FrameworkElement;
                if (obj != null)
                {
                    GeneralTransform gt = obj.TransformToVisual(itemsControl);
                    var rect            = gt.TransformBounds(new Rect(0, 0, obj.ActualWidth, obj.ActualHeight));

                    if (rect.Bottom < 0 || rect.Top > itemsControl.ActualHeight)
                    {
                        continue;
                    }

                    yield return(itemsControl.Items[i]);
                }
            }
        }
Ejemplo n.º 5
0
 private static void SetShiftSteps(ItemsControl itemsControl, int steps)
 {
     if (itemsControl?.Items == null || steps == 0)
     {
         return;
     }
     for (int i = 0; i < itemsControl.Items?.Count; i++)
     {
         var container = itemsControl.ContainerFromIndex(i);
         if (container == null)
         {
             continue;
         }
         var rowlist = VisualTreeHelper.GetChild(container, 0) as RRowlist;
         if (rowlist == null)
         {
             continue;
         }
         rowlist.ShiftSteps = steps;
     }
 }
        /// <summary>
        /// Synchronizes the scroll offset of the target ItemsControl to the offset of the source ItemsControl
        /// such that the first visible item in both controls is the same item.
        /// </summary>
        /// <param name="targetItemsControl">The ItemsControl whose scroll offset is to be updated.</param>
        /// <param name="sourceItemsControl">The ItemsControl whose scroll offset will be matched in the target.</param>
        /// <param name="throwOnFail">Specifies whether an exception should be thrown on failure.</param>
        public static void SynchronizeScrollOffset(this ItemsControl targetItemsControl, ItemsControl sourceItemsControl, bool throwOnFail = false)
        {
            var firstVisibleIndex = sourceItemsControl.GetFirstVisibleIndex();

            if (firstVisibleIndex == -1)
            {
                if (throwOnFail)
                {
                    throw new InvalidOperationException();
                }

                return;
            }

            var targetListBox = targetItemsControl as ListBox;

            if (targetListBox != null)
            {
                targetListBox.ScrollIntoView(sourceItemsControl.IndexFromContainer(sourceItemsControl.ContainerFromIndex(firstVisibleIndex)));
                return;
            }

            var targetListViewBase = targetItemsControl as ListViewBase;

            if (targetListViewBase != null)
            {
                targetListViewBase.ScrollIntoView(sourceItemsControl.IndexFromContainer(sourceItemsControl.ContainerFromIndex(firstVisibleIndex)), ScrollIntoViewAlignment.Leading);
                return;
            }

            var scrollViewer = targetItemsControl.GetScrollViewer();

            if (scrollViewer != null)
            {
                var container = (FrameworkElement)targetItemsControl.ContainerFromIndex(firstVisibleIndex);
                var position  = container.TransformToVisual(scrollViewer).TransformPoint(new Point());
                scrollViewer.ChangeView(scrollViewer.HorizontalOffset + position.X, scrollViewer.VerticalOffset + position.Y, null);
            }
        }
Ejemplo n.º 7
0
        private Collection <FrameworkElement> GetItemsToAnimate()
        {
            Collection <FrameworkElement> items = new Collection <FrameworkElement>();
            ItemsControl itemsControl           = this.containerToAnimate as ItemsControl;

            if (itemsControl != null)
            {
                // TODO - visible items only
                for (int i = 0; i < itemsControl.Items.Count; i++)
                {
                    FrameworkElement itemToAdd = itemsControl.ContainerFromIndex(i) as FrameworkElement;
                    if (itemToAdd == null || !this.IsItemVisible(itemToAdd))
                    {
                        continue;
                    }

                    if (this.SequentialMode == SequentialMode.FirstToLast)
                    {
                        items.Add(itemToAdd);
                    }
                    else
                    {
                        items.Insert(0, itemToAdd);
                    }
                }
            }
            else
            {
                if (this.containerToAnimate is IItemsContainer)
                {
                    FrameworkElement[] viewportItems = ((IItemsContainer)this.containerToAnimate).ViewportItems;
                    for (int i = 0; i < viewportItems.Length; i++)
                    {
                        FrameworkElement itemToAdd = viewportItems[i];
                        if (this.SequentialMode == SequentialMode.FirstToLast)
                        {
                            items.Add(itemToAdd);
                        }
                        else
                        {
                            items.Insert(0, itemToAdd);
                        }
                    }
                }
                else if (this.containerToAnimate is Panel)
                {
                    UIElementCollection children = (this.containerToAnimate as Panel).Children;
                    for (int i = 0; i < children.Count; i++)
                    {
                        FrameworkElement itemToAdd = children[i] as FrameworkElement;
                        if (!this.IsItemVisible(itemToAdd))
                        {
                            continue;
                        }

                        if (this.SequentialMode == SequentialMode.FirstToLast)
                        {
                            items.Add(itemToAdd);
                        }
                        else
                        {
                            items.Insert(0, itemToAdd);
                        }
                    }
                }
            }

            return(items);
        }
        public static IList <WeakReference> VisibleItems(this ItemsControl itemsControl)
        {
            var result = new List <WeakReference>();

            if (VisualTreeHelper.GetChildrenCount(itemsControl) == 0)
            {
                return(result);
            }

            var scrollHost = VisualTreeHelper.GetChild(itemsControl, 0) as ScrollViewer;

            if (scrollHost == null)
            {
                return(result);
            }

            if (itemsControl.Items == null)
            {
                return(result);
            }
            itemsControl.UpdateLayout();

            int index;

            for (index = 0; index < itemsControl.Items.Count; index++)
            {
#if NETFX_CORE || WINDOWS_81_PORTABLE
                var container = (FrameworkElement)itemsControl.ContainerFromIndex(index);
#endif
#if WINDOWS_PHONE
                var container = (FrameworkElement)itemsControl.ItemContainerGenerator.ContainerFromIndex(index);
#endif
                if (container != null)
                {
                    GeneralTransform itemTransform = null;
                    try
                    {
                        itemTransform = container.TransformToVisual(scrollHost);
                    }
                    catch (ArgumentException)   // not always in visual tree
                    {
                        return(result);
                    }

#if NETFX_CORE || WINDOWS_81_PORTABLE
                    var boundingBox = new Rect(
                        itemTransform.TransformPoint(new Point()),
                        itemTransform.TransformPoint(new Point(container.ActualWidth, container.ActualHeight)));
#elif WINDOWS_PHONE
                    var boundingBox = new Rect(
                        itemTransform.Transform(new Point()),
                        itemTransform.Transform(new Point(container.ActualWidth, container.ActualHeight)));
#endif

                    if (boundingBox.Bottom > 0)
                    {
                        result.Add(new WeakReference(container));
                        index++;
                        break;
                    }
                }
            }

            for (; index < itemsControl.Items.Count; index++)
            {
#if NETFX_CORE || WINDOWS_81_PORTABLE
                var container = (FrameworkElement)itemsControl.ContainerFromIndex(index);
#endif
#if WINDOWS_PHONE
                var container = (FrameworkElement)itemsControl.ItemContainerGenerator.ContainerFromIndex(index);
#endif
                GeneralTransform itemTransform = null;
                try
                {
                    itemTransform = container.TransformToVisual(scrollHost);
                }
                catch (ArgumentException)   // not always in visual tree
                {
                    return(result);
                }

#if NETFX_CORE || WINDOWS_81_PORTABLE
                var boundingBox = new Rect(
                    itemTransform.TransformPoint(new Point()),
                    itemTransform.TransformPoint(new Point(container.ActualWidth, container.ActualHeight)));
#elif WINDOWS_PHONE
                var boundingBox = new Rect(
                    itemTransform.Transform(new Point()),
                    itemTransform.Transform(new Point(container.ActualWidth, container.ActualHeight)));
#endif

                if (boundingBox.Top >= scrollHost.ActualHeight)
                {
                    break;
                }

                result.Add(new WeakReference(container));
            }

            return(result);
        }