首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >VirtualizingStackPanel.CacheSize在.Net 4.0中的选择

VirtualizingStackPanel.CacheSize在.Net 4.0中的选择
EN

Stack Overflow用户
提问于 2013-10-02 14:08:30
回答 2查看 1K关注 0票数 0

虚拟化堆栈面板在决定可视化可见项时会考虑哪些因素?

例句:有一个列表视图,当查看第7项时,第6和第8项也会被可视化,尽管它们没有被看到。

如何限制可视化的项目,使只有可见的项目被可视化?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-06 11:36:21

我已经通过重写MeasureOverride函数解决了这个问题,我们已经购买了Sheridan在他的回答中提到的书,取决于虚拟化章节,下面是我对扩展VirtualizingStackPanel的类所做的事情:它成功了!

代码语言:javascript
运行
复制
private ItemsControl ItemsOwner { get; set; }
        private int StartIndex { get; set; }
        private int EndIndex { get; set; }


        protected override void OnInitialized(EventArgs e)
        {
            ItemsOwner = ItemsControl.GetItemsOwner(this) as ItemsControl;
        }


        protected override Size MeasureOverride(Size availableSize)
        {
            ItemsControl itemsControl = ItemsControl.GetItemsOwner(this);

            // we can set StartIndex& EndIndex to mimic 
            // VirtualizingStackPanel.CacheSize in .Net 4.5
            // for my problem, I just fixed them at the index of item to be shown 
            StartIndex = PagesView.Instance.SelectedIndex;
            EndIndex = StartIndex;

            // Virtualize items
            IItemContainerGenerator generator = ItemsOwner.ItemContainerGenerator;

            GeneratorPosition startPos = generator.GeneratorPositionFromIndex(StartIndex);
            int childIndex = startPos.Offset == 0 ? startPos.Index : startPos.Index + 1;
            using (generator.StartAt(startPos, GeneratorDirection.Forward, true))
            {
                for (int i = StartIndex; i <= EndIndex; i++, childIndex++)
                {
                    bool isNewlyRealized;
                    UIElement child = generator.GenerateNext(out isNewlyRealized) as UIElement;
                    if (isNewlyRealized)
                    {
                        if (childIndex >= InternalChildren.Count)
                        {
                            AddInternalChild(child);
                        }
                        else
                        {
                            InsertInternalChild(childIndex, child);
                        }
                        generator.PrepareItemContainer(child);
                    }
                }
            }



            //DumpGeneratorContent();


            // Measure
            foreach (UIElement child in InternalChildren)
            {
                child.Measure(availableSize);
            }

            // Clean up
            CleanupItems();

            return availableSize;
        }

        private void CleanupItems()
        {
            IItemContainerGenerator generator = ItemsOwner.ItemContainerGenerator;
            for (int i = InternalChildren.Count - 1; i >= 0; i--)
            {
                GeneratorPosition position = new GeneratorPosition(i, 0);
                int itemIndex = generator.IndexFromGeneratorPosition(position);
                if (itemIndex < StartIndex || itemIndex > EndIndex)
                {
                    generator.Remove(position, 1);
                    RemoveInternalChildRange(i, 1);
                }
            }
        }
票数 0
EN

Stack Overflow用户

发布于 2013-10-02 15:58:25

虚拟化是一个相当复杂的主题,但我有一本书很好地描述了它。此外,本书还展示了如何实现自定义虚拟化,您可能需要实现这些虚拟化才能实现您的目标。幸运的是,我发现有人在网上发布了这本书的PDF格式,你可以通过点击此链接找到它。

虚拟化部分从第129页开始,但其他部分也很值得一读,因为其中包含了一些非常有趣的内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19138934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档