虚拟化堆栈面板在决定可视化可见项时会考虑哪些因素?
例句:有一个列表视图,当查看第7项时,第6和第8项也会被可视化,尽管它们没有被看到。
如何限制可视化的项目,使只有可见的项目被可视化?
发布于 2013-10-06 11:36:21
我已经通过重写MeasureOverride
函数解决了这个问题,我们已经购买了Sheridan在他的回答中提到的书,取决于虚拟化章节,下面是我对扩展VirtualizingStackPanel
的类所做的事情:它成功了!
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);
}
}
}
发布于 2013-10-02 15:58:25
虚拟化是一个相当复杂的主题,但我有一本书很好地描述了它。此外,本书还展示了如何实现自定义虚拟化,您可能需要实现这些虚拟化才能实现您的目标。幸运的是,我发现有人在网上发布了这本书的PDF格式,你可以通过点击此链接找到它。
虚拟化部分从第129页开始,但其他部分也很值得一读,因为其中包含了一些非常有趣的内容。
https://stackoverflow.com/questions/19138934
复制相似问题