Canvas
コンテナとして使用する場合、コンテナをリサイクルするカスタムを実装したいと考えていますItemsPanel
。そのため、 andから派生し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;
}
}
しかし、うまくいきません。これを行う方法はありますか?