private void MeasureForward(ref MeasureContext context) { var firstContainerDesiredSize = new RadSize(); var lastContainerDesiredSize = new RadSize(); using (var itemInfos = this.layout.GetLines(context.FirstVisibleIndex, true).GetEnumerator()) { if (itemInfos.MoveNext()) { firstContainerDesiredSize = this.GenerateContainer(itemInfos.Current); context.ForwardGeneratedLength += context.GetLength(firstContainerDesiredSize); context.MaxLength = Math.Max(context.MaxLength, context.GetOppositeLength(firstContainerDesiredSize)); // Take the length portion of the indexed element that is not currently in viewport. this.HiddenPixels = GridModel.DoubleArithmetics.Floor(context.GetLength(firstContainerDesiredSize) * (context.Index % 1)); context.ForwardGeneratedLength -= this.HiddenPixels; context.ForwardGeneratedLength = GridModel.DoubleArithmetics.Ceiling(context.ForwardGeneratedLength); lastContainerDesiredSize = firstContainerDesiredSize; this.ViewportItemCount++; } while (GridModel.DoubleArithmetics.IsLessThan(context.ForwardGeneratedLength, context.AvailableLength) && itemInfos.MoveNext()) { context.LastVisibleIndex++; lastContainerDesiredSize = this.GenerateContainer(itemInfos.Current); context.ForwardGeneratedLength += context.GetLength(lastContainerDesiredSize); context.MaxLength = Math.Max(context.MaxLength, context.GetOppositeLength(lastContainerDesiredSize)); this.ViewportItemCount++; } } }
private int GenerateBottomBufferItems(int startGenerateIndex, double viewportLength, MeasureContext context) { var buffer = viewportLength * context.BufferScale; var startIndex = startGenerateIndex + 1; var lastGeneratedIndex = startIndex; var generatedLengthContext = this.GeneratedLengthContext; using (var itemInfos = this.Layout.GetLines(startIndex, true).GetEnumerator()) { var generatedLength = 0.0; var generatedLengthForward = context.ForwardGeneratedLength; while (ListViewModel.DoubleArithmetics.IsLessThan(generatedLength - generatedLengthForward, buffer) && itemInfos.MoveNext()) { var size = this.GenerateContainer(itemInfos.Current, context); // generatedLength += this.IsHorizontal ? size.Width : size.Height; generatedLength += generatedLengthContext.GenerateLength(context.GetLength(size)); lastGeneratedIndex++; } } return(lastGeneratedIndex == startIndex ? startGenerateIndex : lastGeneratedIndex + 1); }
private int GenerateTopBufferItems(int startGenerateIndex, double viewportLength, double startOffset, MeasureContext context) { if (startGenerateIndex == 0) { return(startGenerateIndex); } var buffer = viewportLength * context.BufferScale; var startBufferOffset = Math.Max(0, startOffset - buffer); var startIndex = Math.Min((int)this.Layout.SlotFromPhysicalOffset(startBufferOffset), startGenerateIndex); if (startIndex > 0) { startIndex -= 1; } var endIndex = startIndex - 1; var generatedLengthContext = this.GeneratedLengthContext; using (var itemInfos = this.Layout.GetLines(startIndex, true).GetEnumerator()) { var generatedLength = 0.0; while (ListViewModel.DoubleArithmetics.IsLessThan(generatedLength, buffer) && itemInfos.MoveNext()) { var size = this.GenerateContainer(itemInfos.Current, context); // generatedLength += this.IsHorizontal ? size.Width : size.Height; generatedLength += generatedLengthContext.GenerateLength(context.GetLength(size)); endIndex++; } } return(endIndex == startIndex - 1 ? startGenerateIndex : endIndex + 1); }
private MeasureContext MeasureHorizontalFrozenElements(RadSize availableSize, int frozenContainersCount) { var context = new MeasureContext(); context.InitializeForHorizontalMeasure(this, availableSize); if (frozenContainersCount == 0) { return(context); } var firstContainerDesiredSize = new RadSize(); var lastContainerDesiredSize = new RadSize(); using (var itemInfos = this.layout.GetLines(context.FirstVisibleIndex, true).GetEnumerator()) { if (itemInfos.MoveNext()) { firstContainerDesiredSize = this.GenerateContainer(itemInfos.Current); context.ForwardGeneratedLength = context.GetLength(firstContainerDesiredSize); context.MaxLength = Math.Max(context.MaxLength, context.GetOppositeLength(firstContainerDesiredSize)); // Take the length portion of the indexed element that is not currently in viewport. this.HiddenPixels = GridModel.DoubleArithmetics.Floor(context.ForwardGeneratedLength * (context.Index % 1)); context.ForwardGeneratedLength -= this.HiddenPixels; context.ForwardGeneratedLength = GridModel.DoubleArithmetics.Ceiling(context.ForwardGeneratedLength); lastContainerDesiredSize = firstContainerDesiredSize; this.ViewportItemCount++; } while (frozenContainersCount - 1 > context.LastVisibleIndex && GridModel.DoubleArithmetics.IsLessThan(context.ForwardGeneratedLength, context.AvailableLength) && itemInfos.MoveNext()) { context.LastVisibleIndex++; lastContainerDesiredSize = this.GenerateContainer(itemInfos.Current); context.ForwardGeneratedLength += context.GetLength(lastContainerDesiredSize); context.MaxLength = Math.Max(context.MaxLength, context.GetOppositeLength(lastContainerDesiredSize)); this.ViewportItemCount++; } } return(context); }
private void MeasureBackwards(ref MeasureContext context) { if (context.AvailableLength - context.ForwardGeneratedLength > GridModel.DoubleArithmetics.Ceiling(1d / IndexStorage.PrecisionMultiplier)) { if (context.FirstVisibleIndex + this.ViewportItemCount < this.layout.VisibleLineCount) { var firstContainerDesiredSize = new RadSize(); using (var itemInfos = this.layout.GetLines(context.FirstVisibleIndex - 1, false).GetEnumerator()) { while (GridModel.DoubleArithmetics.IsLessThan(context.GeneratedLength, context.AvailableLength) && itemInfos.MoveNext()) { context.FirstVisibleIndex--; firstContainerDesiredSize = this.GenerateContainer(itemInfos.Current); context.BackwardGeneratedLength += context.GetLength(firstContainerDesiredSize); context.MaxLength = Math.Max(context.MaxLength, context.GetOppositeLength(firstContainerDesiredSize)); this.ViewportItemCount++; } } } } }