示例#1
0
        private void Initialize()
        {
            _itemsControl = ItemsControl.GetItemsOwner(this);
            _itemsGenerator = (IRecyclingItemContainerGenerator) ItemContainerGenerator;

            InvalidateMeasure();
        }
        protected override void OnItemsChanged(object sender, ItemsChangedEventArgs args)
        {
            switch (args.Action)
            {
            case NotifyCollectionChangedAction.Remove:
            case NotifyCollectionChangedAction.Replace:
                RemoveInternalChildRange(args.Position.Index, args.ItemUICount);
                break;

            case NotifyCollectionChangedAction.Move:
                if (args.Position.Index < 0)
                {
                    InvalidateMeasure();
                    ScrollOwner?.InvalidateScrollInfo();
                    SetVerticalOffset(0);
                }
                else
                {
                    RemoveInternalChildRange(args.OldPosition.Index, args.ItemUICount);
                }
                break;

            case NotifyCollectionChangedAction.Reset:
                itemsControl = ItemsControl.GetItemsOwner(this);
                generator    = (IRecyclingItemContainerGenerator)ItemContainerGenerator;
                InvalidateMeasure();
                ScrollOwner?.InvalidateScrollInfo();
                SetVerticalOffset(0);
                break;
            }
        }
示例#3
0
        private void Initialize()
        {
            _itemsControl   = ItemsControl.GetItemsOwner(this);
            _itemsGenerator = (IRecyclingItemContainerGenerator)ItemContainerGenerator;

            InvalidateMeasure();
        }
        private void Initialize()
        {
            _itemsControl = ItemsControl.GetItemsOwner(this);
#if NETFX_CORE
            _itemsGenerator = ItemContainerGenerator;
#else
            _itemsGenerator = (IRecyclingItemContainerGenerator)ItemContainerGenerator;
#endif

            InvalidateMeasure();
        }
示例#5
0
        //
        // Helper Methods
        //
        void RemoveUnusedContainers(int first, int count)
        {
            IRecyclingItemContainerGenerator generator = ItemContainerGenerator as IRecyclingItemContainerGenerator;
            ItemsControl       owner = ItemsControl.GetItemsOwner(this);
            VirtualizationMode mode  = GetVirtualizationMode(this);
            CleanUpVirtualizedItemEventArgs args;
            int last = first + count - 1;
            GeneratorPosition pos;
            int item;

            //Console.WriteLine ("VSP.RemoveUnusedContainers ({0}, {1});", first, count);
            pos = new GeneratorPosition(Children.Count - 1, 0);
            while (pos.Index >= 0)
            {
                item = generator.IndexFromGeneratorPosition(pos);

                if (item < first || item > last)
                {
                    //Console.WriteLine ("\tRemoving item[{0}] (child #{1})", item, pos.Index);
                    args = new CleanUpVirtualizedItemEventArgs(Children[pos.Index], owner.Items[item]);
                    OnCleanUpVirtualizedItem(args);

                    if (!args.Cancel)
                    {
                        RemoveInternalChildRange(pos.Index, 1);

                        if (mode == VirtualizationMode.Recycling)
                        {
                            generator.Recycle(pos, 1);
                        }
                        else
                        {
                            generator.Remove(pos, 1);
                        }
                    }
                }

                pos.Index--;
            }
        }
        //
        // Helper Methods
        //
        void RemoveUnusedContainers(int first, int count)
        {
            IRecyclingItemContainerGenerator generator = ItemContainerGenerator as IRecyclingItemContainerGenerator;
            ItemsControl       owner = ItemsControl.GetItemsOwner(this);
            VirtualizationMode mode  = GetVirtualizationMode(this);
            int last = first + count - 1;
            GeneratorPosition pos;
            int item;

            //Console.WriteLine ("VSP.RemoveUnusedContainers ({0}, {1});", first, count);
            pos = new GeneratorPosition(Children.Count - 1, 0);
            while (pos.Index >= 0)
            {
                item = generator.IndexFromGeneratorPosition(pos);

                // Note: we should not remove the child if it is an item of its owner ItemsControl be
                // we remove it anyway because ScrollContentPresenter does not properly work with an
                // external IScrollInfo which leads to layout issues
                if ((item < first || item > last) &&
                    /*!((IGeneratorHost)owner).IsItemItsOwnContainer(owner.Items[item]) &&*/
                    NotifyCleanupItem(Children[pos.Index], owner))
                {
                    RemoveInternalChildRange(pos.Index, 1);

                    if (mode == VirtualizationMode.Recycling &&
                        !((IGeneratorHost)owner).IsItemItsOwnContainer(owner.Items[item]))
                    {
                        generator.Recycle(pos, 1);
                    }
                    else
                    {
                        generator.Remove(pos, 1);
                    }
                }

                pos.Index--;
            }
        }
        protected override Size MeasureOverride(Size availableSize)
        {
            UpdateScrollInfo(availableSize);

            // This is for weird edge case where Measuring can occur and OnItemsChanged was not called by WPF first
            if (ItemWidth == 0)
            {
                itemsControl = ItemsControl.GetItemsOwner(this);
                generator    = (IRecyclingItemContainerGenerator)ItemContainerGenerator;
                using (generator.StartAt(generator.GeneratorPositionFromIndex(0), GeneratorDirection.Forward, true))
                {
                    UIElement child = generator.GenerateNext(out var newlyRealized) as UIElement;
                    if (child != null)
                    {
                        AddInternalChild(child);
                        generator.PrepareItemContainer(child);
                        child.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
                        UpdateScrollInfo(availableSize);
                        RemoveInternalChildRange(0, 1);
                    }
                }
            }

            GetVisibleRange(out var firstItemIndex, out var lastItemIndex);
            if (lastItemIndex < 0)
            {
                return(new Size(0, 0));
            }

            var startPos   = generator.GeneratorPositionFromIndex(firstItemIndex);
            var childIndex = (startPos.Offset == 0) ? startPos.Index : startPos.Index + 1;

            using (generator.StartAt(startPos, GeneratorDirection.Forward, true))
            {
                for (int itemIndex = firstItemIndex; itemIndex <= lastItemIndex; ++itemIndex, ++childIndex)
                {
                    UIElement child = generator.GenerateNext(out var newlyRealized) as UIElement;
                    if (child == null)
                    {
                        continue;
                    }

                    if (newlyRealized)
                    {
                        if (childIndex >= InternalChildren.Count)
                        {
                            AddInternalChild(child);
                        }
                        else
                        {
                            InsertInternalChild(childIndex, child);
                        }

                        generator.PrepareItemContainer(child);
                    }
                    else if (!InternalChildren.Contains(child))
                    {
                        InsertInternalChild(childIndex, child);
                        ItemContainerGenerator.PrepareItemContainer(child);
                    }

                    child.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
                }
            }

            CleanUpItems(firstItemIndex, lastItemIndex);
            if (availableSize.Width == double.PositiveInfinity || availableSize.Height == double.PositiveInfinity)
            {
                return(GetExtent());
            }
            else
            {
                return(availableSize);
            }
        }
        private void Initialize()
        {
            _itemsControl = ItemsControl.GetItemsOwner(this);
            _itemsGenerator = (IRecyclingItemContainerGenerator)ItemContainerGenerator;


            _itemsControl.LostFocus += _itemsControl_LostFocus;
            _itemsControl.LostKeyboardFocus += _itemsControl_LostKeyboardFocus;
            InvalidateMeasure();
        }