void InitializeMeasureCache()
        {
            _baseItemSize     = 0;
            _scrollCanvasSize = new Size(0, 0);

            if (_allocatedSize.Width <= 0 || _allocatedSize.Height <= 0)
            {
                return;
            }

            if (!_hasUnevenRows)
            {
                CollectionView !.ContentSizeUpdated();
                return;
            }

            int n = CollectionView !.Count;

            _itemSizes            = new List <double>();
            _cached               = new List <bool>();
            _accumulatedItemSizes = new List <double>();

            for (int i = 0; i < n; i++)
            {
                _cached.Add(false);
                _itemSizes.Add(BaseItemSize);
                _accumulatedItemSizes.Add((i > 0 ? (_accumulatedItemSizes[i - 1] + ItemSpacing) : ItemStartPoint) + _itemSizes[i]);
            }
            CollectionView !.ContentSizeUpdated();
        }
        public void ItemRemoved(int removed)
        {
            if (_realizedItem.ContainsKey(removed))
            {
                CollectionView !.UnrealizeView(_realizedItem[removed].View);
                _realizedItem.Remove(removed);
            }

            var items = _realizedItem.Keys.OrderBy(key => key);

            foreach (var index in items)
            {
                if (index > removed)
                {
                    _realizedItem[index - 1] = _realizedItem[index];
                }
            }

            var last = items.LastOrDefault();

            if (last > removed)
            {
                _realizedItem.Remove(last);
            }

            UpdateRemovedSize(removed);

            _scrollCanvasSize = new Size(0, 0);
            CollectionView !.ContentSizeUpdated();
        }
        public void SetFooter(View?footer, Size size)
        {
            bool contentSizeChanged = false;

            if (IsHorizontal)
            {
                if (_footerSize.Width != size.Width)
                {
                    contentSizeChanged = true;
                }
            }
            else
            {
                if (_footerSize.Height != size.Height)
                {
                    contentSizeChanged = true;
                }
            }

            _footer     = footer;
            _footerSize = size;

            if (contentSizeChanged)
            {
                InitializeMeasureCache();
                CollectionView !.ContentSizeUpdated();
            }

            UpdateFooterPosition();
        }
        public void ItemInserted(int inserted)
        {
            var items = _realizedItem.Keys.OrderByDescending(key => key);

            foreach (var index in items)
            {
                if (index >= inserted)
                {
                    _realizedItem[index + 1] = _realizedItem[index];
                }
            }
            if (_realizedItem.ContainsKey(inserted))
            {
                _realizedItem.Remove(inserted);
            }
            else
            {
                var last = items.LastOrDefault();
                if (last >= inserted)
                {
                    _realizedItem.Remove(last);
                }
            }

            UpdateInsertedSize(inserted);

            _scrollCanvasSize = new Size(0, 0);
            CollectionView !.ContentSizeUpdated();
        }
 public void Reset()
 {
     foreach (var realizedItem in _realizedItem.Values.ToList())
     {
         CollectionView !.UnrealizeView(realizedItem.View);
     }
     _realizedItem.Clear();
     _scrollCanvasSize = new Size(0, 0);
     CollectionView !.ContentSizeUpdated();
 }
        public void SetHeader(View?header, Size size)
        {
            bool contentSizeChanged = false;

            if (IsHorizontal)
            {
                if (_headerSize.Width != size.Width)
                {
                    contentSizeChanged = true;
                }
            }
            else
            {
                if (_headerSize.Height != size.Height)
                {
                    contentSizeChanged = true;
                }
            }

            _header     = header;
            _headerSize = size;

            if (contentSizeChanged)
            {
                InitializeMeasureCache();
                CollectionView !.ContentSizeUpdated();
            }

            if (_header != null)
            {
                var bound = new Rect(0, 0, _headerSize.Width, _headerSize.Height);
                if (IsHorizontal)
                {
                    bound.Height = _allocatedSize.Height;
                }
                else
                {
                    bound.Width = _allocatedSize.Width;
                }
                _header.UpdateBounds(bound);
            }
        }
        public Size GetScrollCanvasSize()
        {
            if (CollectionView !.Count == 0 || _allocatedSize.Width <= 0 || _allocatedSize.Height <= 0)
            {
                return(_allocatedSize);
            }

            if (_scrollCanvasSize.Width > 0 && _scrollCanvasSize.Height > 0)
            {
                return(_scrollCanvasSize);
            }

            double totalItemSize = 0;

            if (_hasUnevenRows)
            {
                // If item source was shared between adaptors, in some case CollectionView.Count could be wrong
                if (_accumulatedItemSizes.Count == 0)
                {
                    return(_allocatedSize);
                }
                totalItemSize = _accumulatedItemSizes[_accumulatedItemSizes.Count - 1] + FooterSizeWithSpacing;
            }
            else
            {
                totalItemSize = (BaseItemSize + ItemSpacing) * CollectionView !.Count - ItemSpacing + ItemStartPoint + FooterSizeWithSpacing;
            }

            if (IsHorizontal)
            {
                _scrollCanvasSize = new Size(totalItemSize, _allocatedSize.Height);
            }
            else
            {
                _scrollCanvasSize = new Size(_allocatedSize.Width, totalItemSize);
            }

            return(_scrollCanvasSize);
        }
 public static void UpdateSize(this View view, Size size)
 {
     view.Size = size.ToNative();
 }
 public void SizeAllocated(Size size)
 {
     _allocatedSize = size;
     InitializeMeasureCache();
 }
Exemplo n.º 10
0
 public static void UpdateSize(this EvasObject view, Size size)
 {
     view.Resize((int)size.Width, (int)size.Height);
 }
Exemplo n.º 11
0
 public static Size ToDP(this TSize size)
 {
     return(new Size(ConvertToScaledDP(size.Width), ConvertToScaledDP(size.Height)));
 }