internal void RemoveRange(int startIndex, int endIndex) { for (int i = startIndex; i <= endIndex; i++) { if (i > _items.Count) { break; } StaggeredItem item = _items[i]; item.Height = 0; item.Top = 0; // We must recycle all elements to ensure that it gets the correct context RecycleElementAt(i); } foreach (var kvp in _columnLayout) { StaggeredColumnLayout layout = kvp.Value; for (int i = 0; i < layout.Count; i++) { if ((startIndex <= layout[i].Index) && (layout[i].Index <= endIndex)) { int numToRemove = layout.Count - i; layout.RemoveRange(i, numToRemove); break; } } } }
internal void RemoveFromIndex(int index) { if (index > _items.Count) { // Item was added/removed but we haven't realized that far yet return; } int numToRemove = _items.Count - index; _items.RemoveRange(index, numToRemove); foreach (var kvp in _columnLayout) { StaggeredColumnLayout layout = kvp.Value; for (int i = 0; i < layout.Count; i++) { if (layout[i].Index >= index) { numToRemove = layout.Count - i; layout.RemoveRange(i, numToRemove); break; } } } }
internal void AddItemToColumn(StaggeredItem item, int columnIndex) { if (_columnLayout.TryGetValue(columnIndex, out StaggeredColumnLayout columnLayout) == false) { columnLayout = new StaggeredColumnLayout(); _columnLayout[columnIndex] = columnLayout; } if (columnLayout.Contains(item) == false) { columnLayout.Add(item); } }
/// <inheritdoc/> protected override Size ArrangeOverride(VirtualizingLayoutContext context, Size finalSize) { if ((context.RealizationRect.Width == 0) && (context.RealizationRect.Height == 0)) { return(finalSize); } var state = (StaggeredLayoutState)context.LayoutState; // Cycle through each column and arrange the items that are within the realization bounds for (int columnIndex = 0; columnIndex < state.NumberOfColumns; columnIndex++) { StaggeredColumnLayout layout = state.GetColumnLayout(columnIndex); for (int i = 0; i < layout.Count; i++) { StaggeredItem item = layout[i]; double bottom = item.Top + item.Height; if (bottom < context.RealizationRect.Top) { // element is above the realization bounds continue; } if (item.Top <= context.RealizationRect.Bottom) { double itemHorizontalOffset = (state.ColumnWidth * columnIndex) + (ColumnSpacing * columnIndex); Rect bounds = new Rect(itemHorizontalOffset, item.Top, state.ColumnWidth, item.Height); UIElement element = context.GetOrCreateElementAt(item.Index); element.Arrange(bounds); } else { break; } } } return(finalSize); }