WPF 项目容器回收
我想实现一个自定义 Canvas
,当用作 ItemsPanel
时,它会回收容器。因此,我从VirtualizingPanel
派生并覆盖ArrangeOverride
和MeasureOverride
。我正在 MeasureOverride 中进行生成,如下所示:
var children = base.InternalChildren;
var itemsControl = ItemsControl.GetItemsOwner(this);
var itemsCount = itemsControl.Items.Count;
IItemContainerGenerator generator = itemsControl.ItemContainerGenerator;
var startPos = generator.GeneratorPositionFromIndex(0);
using (generator.StartAt(startPos, GeneratorDirection.Forward, true))
{
for (int i = 0; i < itemsCount; i++)
{
bool isNewlyRealized;
var child = generator.GenerateNext(out isNewlyRealized) as UIElement;
if (isNewlyRealized)
{
base.AddInternalChild(child);
generator.PrepareItemContainer(child);
}
child.Measure(constraint);
}
}
我不知道如何进行回收。我尝试了类似以下的方法:
protected override void OnItemsChanged(object sender, ItemsChangedEventArgs e)
{
switch (e.Action)
{
case NotifyCollectionChangedAction.Remove:
case NotifyCollectionChangedAction.Replace:
case NotifyCollectionChangedAction.Move:
IRecyclingItemContainerGenerator generator = ItemsControl.GetItemsOwner(this).ItemContainerGenerator;
generator.Recycle(e.Position, e.ItemUICount);
RemoveInternalChildRange(e.Position.Index, e.ItemUICount);
break;
}
}
但它不起作用。知道如何做到这一点吗?
I want to implement a custom Canvas
that recycles containers when used as an ItemsPanel
. So I derived from VirtualizingPanel
and override the ArrangeOverride
and MeasureOverride
. I am doing the generation in MeasureOverride
like this:
var children = base.InternalChildren;
var itemsControl = ItemsControl.GetItemsOwner(this);
var itemsCount = itemsControl.Items.Count;
IItemContainerGenerator generator = itemsControl.ItemContainerGenerator;
var startPos = generator.GeneratorPositionFromIndex(0);
using (generator.StartAt(startPos, GeneratorDirection.Forward, true))
{
for (int i = 0; i < itemsCount; i++)
{
bool isNewlyRealized;
var child = generator.GenerateNext(out isNewlyRealized) as UIElement;
if (isNewlyRealized)
{
base.AddInternalChild(child);
generator.PrepareItemContainer(child);
}
child.Measure(constraint);
}
}
What I don't know is how to make the recycling. I tried something like the following:
protected override void OnItemsChanged(object sender, ItemsChangedEventArgs e)
{
switch (e.Action)
{
case NotifyCollectionChangedAction.Remove:
case NotifyCollectionChangedAction.Replace:
case NotifyCollectionChangedAction.Move:
IRecyclingItemContainerGenerator generator = ItemsControl.GetItemsOwner(this).ItemContainerGenerator;
generator.Recycle(e.Position, e.ItemUICount);
RemoveInternalChildRange(e.Position.Index, e.ItemUICount);
break;
}
}
But it doesn't work. Any idea how to do this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
看这里:
http://blogs.claritycon.com/blogs/lee_roth/default.aspx
我通过以下方式进行回收:
在
OnItemsChanged
中,我仅调用RemoveInternalChildRange
:在 Measure override 中,我首先添加新项目,然后删除旧项目。
如果你使用回收,你必须知道,如果你得到一个回收的容器,你通过调用GenerateNext得到的新标志也是假的。
这里我们添加新的项目:
添加项目后,我们删除旧的项目:
希望可以帮到你。
Look here:
http://blogs.claritycon.com/blogs/lee_roth/default.aspx
I make recycling the following way:
In
OnItemsChanged
, I only callRemoveInternalChildRange
:In Measure override, I first add new items, then I remove the old ones.
If you use recycling you have to know that the new-Flag that you get by calling GenerateNext is also false if you get a recycled container.
Here we add new Items:
After adding Items we remove the old Items:
I hope I could help you.