internal bool IsOnCurrentPage(ListBoxItem item) { var itemsHostRect = Rect.Empty; var listBoxItemRect = Rect.Empty; if (_visual == null) { ItemsControlHelper ich = new ItemsControlHelper(ListBox); ScrollContentPresenter scp = ich.ScrollHost == null ? null : ich.ScrollHost.GetVisualDescendants().OfType<ScrollContentPresenter>().FirstOrDefault(); _visual = (ich.ScrollHost == null) ? null : ((scp == null) ? ((FrameworkElement)ich.ScrollHost) : ((FrameworkElement)scp)); } if (_visual == null) return true; itemsHostRect = new Rect(0.0, 0.0, _visual.ActualWidth, _visual.ActualHeight); //ListBoxItem item = ListBox.ItemContainerGenerator.ContainerFromIndex(index) as ListBoxItem; if (item == null) { listBoxItemRect = Rect.Empty; return false; } GeneralTransform transform = item.TransformToVisual(_visual); listBoxItemRect = new Rect(transform.Transform(new Point()), transform.Transform(new Point(item.ActualWidth, item.ActualHeight))); if (!this.IsVerticalOrientation()) { return ((itemsHostRect.Left <= listBoxItemRect.Left) && (listBoxItemRect.Right <= itemsHostRect.Right)); } return ((listBoxItemRect.Bottom + 100 >= itemsHostRect.Top) && (listBoxItemRect.Top - 100 <= itemsHostRect.Bottom)); //return ((itemsHostRect.Top <= listBoxItemRect.Bottom) && (listBoxItemRect.Top <= itemsHostRect.Bottom)); }
/// <summary> /// Indicate whether the specified item is currently visible. /// </summary> /// <param name="item">The item.</param> /// <param name="itemsHostRect">Rect for the item host element.</param> /// <param name="listBoxItemRect">Rect for the ListBoxItem element.</param> /// <returns>True if the item is visible; false otherwise.</returns> /// <remarks>Similar to WPF's corresponding ItemsControl method.</remarks> private bool IsOnCurrentPage(object item, out Rect itemsHostRect, out Rect listBoxItemRect) { // Get Rect for item host element DependencyObject ItemsHost = VisualTreeHelper.GetChild(this, 0); ItemsHost = VisualTreeHelper.GetChild(ItemsHost, 0); FrameworkElement itemsHost = (null != TemplateScrollViewer) ? ((null != TemplateScrollViewer.ElementScrollContentPresenter) ? TemplateScrollViewer.ElementScrollContentPresenter as FrameworkElement : TemplateScrollViewer as FrameworkElement) : ItemsHost as FrameworkElement; if (itemsHost == null) { itemsHostRect = Rect.Empty; listBoxItemRect = Rect.Empty; return(false); } itemsHostRect = new Rect(new Point(), new Point(itemsHost.RenderSize.Width, itemsHost.RenderSize.Height)); ListBoxItem listBoxItem = (ListBoxItem)ItemContainerGenerator.ContainerFromItem(item); if (listBoxItem == null) { listBoxItemRect = Rect.Empty; return(false); } listBoxItemRect = new Rect(new Point(), listBoxItem.RenderSize); // Adjust Rect to account for padding Control itemsHostControl = itemsHost as Control; if (null != itemsHostControl) { Thickness padding = itemsHostControl.Padding; itemsHostRect = new Rect( itemsHostRect.Left + padding.Left, itemsHostRect.Top + padding.Top, itemsHostRect.Width - padding.Left - padding.Right, itemsHostRect.Height - padding.Top - padding.Bottom); } // Get relative Rect for ListBoxItem GeneralTransform generalTransform = listBoxItem.TransformToVisual(itemsHost); if (generalTransform != null) { listBoxItemRect = new Rect(generalTransform.Transform(new Point()), generalTransform.Transform(new Point(listBoxItem.RenderSize.Width, listBoxItem.RenderSize.Height))); } // Return result return(IsVerticalOrientation() ? (itemsHostRect.Top <= listBoxItemRect.Top) && (listBoxItemRect.Bottom <= itemsHostRect.Bottom) : (itemsHostRect.Left <= listBoxItemRect.Left) && (listBoxItemRect.Right <= itemsHostRect.Right)); }