/// <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); } }
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()); }
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]); } } }
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); } }
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); }