private void CreateContainers() { var generator = Owner.ItemContainerGenerator; if (Owner.Bounds.Size.IsDefault) { if ((Items.Count() > 0) && !_estimated) { PdmLogger.Log(0, PdmLogger.IndentEnum.In, $"Estimate {Id} Items:{Items} "); var materialized = generator.Materialize(0, Items.ElementAt(0)); VirtualizingPanel.Children.Insert(0, materialized.ContainerControl); materialized.ContainerControl.Measure(Size.Infinity); VirtualizingAverages.AddContainerSize(GroupControl.TemplatedParent, Items.ElementAt(0), materialized.ContainerControl); //VirtualizingPanel.Children.RemoveAt(0); //generator.Dematerialize(0, 1); //ItemsPresenter.InvalidateMeasure(); _estimated = true; PdmLogger.Log(1, PdmLogger.IndentEnum.Out, $"Estimated {Id} Items:{Items} "); } } else if (Items != null && VirtualizingPanel.IsAttachedToVisualTree) { _realizedChildren.AddChildren(); } _estimatedSize = VirtualizingAverages.GetEstimatedExtent(GroupControl.TemplatedParent, Items, Vertical); }
internal double AddOneChild(RealizedItemsInfo info) { var child = _generator.ContainerFromIndex(_info.Next); if (child == null) { var materialized = _generator.Materialize(_info.Next, _items.ElementAt(_info.Next)); child = materialized.ContainerControl; _panel.Children.Add(child); child.Measure(Size.Infinity); PdmLogger.Log(2, PdmLogger.IndentEnum.Nothing, $"Add new Item {child.DataContext} to {this} {_info._currentOffset:0.00}"); if (VirtualizingAverages.AddContainerSize(_groupControl.TemplatedParent, _items.ElementAt(_info.Next), child)) { _owner.InvalidateMeasure(); } } else { if (child is GroupItem gi) { gi.Presenter?.InvalidateMeasure(); } if (_id == 402) { } child.Measure(Size.Infinity); PdmLogger.Log(2, PdmLogger.IndentEnum.Nothing, $"Add old Item {child.DataContext} to {this} {_info._currentOffset:0.00}"); if (VirtualizingAverages.AddContainerSize(_groupControl.TemplatedParent, _items.ElementAt(_info.Next), child)) { _owner.InvalidateMeasure(); } } return(_info.Vert ? child.DesiredSize.Height : child.DesiredSize.Width); }
internal virtual void SetFirst(Vector scrollPos) { FirstInCache = VirtualizingAverages.GetStartIndex(_templatedParent, _panelOffset - _cache.GetBackCacheSize(_tempViewport, _tempAverageItem), _items, Vert); _firstInView = VirtualizingAverages.GetStartIndex(_templatedParent, _panelOffset, _items, Vert); _currentOffset = VirtualizingAverages.GetOffsetForIndex(_templatedParent, FirstInCache, _items, Vert); _numInView = 0; _numInCache = 0; NumInFullView = 0; var av = VirtualizingAverages.GetEstimatedAverage(_templatedParent, _items, Vert); _tempAverageItem = Vert ? av.Height : av.Width; }
internal override void SetFirst(Vector scrollPos) { _firstInView = (int)(Vert ? scrollPos.Y : scrollPos.X); if (_items is IGroupingView gv) { _firstInView = gv.GetLocalItemPosition(_firstInView); } ScrollOffset = (int)(Vert ? scrollPos.Y : scrollPos.X) - _firstInView; _currentOffset = VirtualizingAverages.GetOffsetForIndex(_templatedParent, _firstInView, _items, Vert); FirstInCache = VirtualizingAverages.GetStartIndex(_templatedParent, _currentOffset - _cache.GetBackCacheSize(_tempViewport, _tempAverageItem), _items, Vert); _currentOffset = VirtualizingAverages.GetOffsetForIndex(_templatedParent, FirstInCache, _items, Vert); _numInView = 0; _numInCache = 0; NumInFullView = 0; var av = VirtualizingAverages.GetEstimatedAverage(_templatedParent, _items, Vert); _tempAverageItem = Vert ? av.Height : av.Width; }
public override Size ArrangeOverride(Size finalSize) { PdmLogger.Log(0, PdmLogger.IndentEnum.In, $"Arrange Realized {_realizedChildren} {finalSize} {++_overrideCount} {Owner.Bounds}"); foreach (var container in _realizedChildren) { var control = container.ContainerControl; var startOffset = VirtualizingAverages.GetOffsetForIndex(GroupControl.TemplatedParent, container.Index, Items, Vertical); if (Vertical) { control.Arrange(new Rect(new Point(0, startOffset), new Size(finalSize.Width, control.DesiredSize.Height))); } else { control.Arrange(new Rect(new Point(startOffset, 0), new Size(control.DesiredSize.Width, finalSize.Height))); } } Owner.Panel.Arrange(new Rect(finalSize)); PdmLogger.Log(1, PdmLogger.IndentEnum.Out, $"Arranged Realized {_realizedChildren} {finalSize} {_overrideCount} {Owner.Bounds}"); return(finalSize); }