Я хочу реализовать обычай Canvas
, который перерабатывает контейнеры при использовании в качестве ItemsPanel
. Поэтому я получил от VirtualizingPanel
и переопределял ArrangeOverride
и MeasureOverride
. Я делаю поколение MeasureOverride
так:Переработка контейнера для контейнеров WPF
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;
}
}
Но это не работает. есть идеи как это сделать?
На самом деле, если вы перерабатываете, перед созданием новых контейнеров следует называть код «очистка» (ваш последний блок кода). Это потому, что вы хотите переработать доступные контейнеры * до того, как они нужны, а не после. Сохраняет несколько ненужных творений. – MarqueIV
Ссылка больше не доступна. – Djof