Je veux mettre en œuvre un Canvas
personnalisé qui recycle des conteneurs lorsqu'il est utilisé comme ItemsPanel
. Donc, j'ai dérivé de VirtualizingPanel
et remplacer les ArrangeOverride
et MeasureOverride
. Je fais la génération en MeasureOverride
comme ceci:WPF conteneur d'articles de recyclage
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);
}
}
Ce que je ne sais pas comment faire le recyclage. J'ai essayé quelque chose comme le suivant:
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;
}
}
Mais cela ne fonctionne pas. Une idée de comment faire cela?
En fait, si vous faites du recyclage, vous devriez appeler votre code de 'nettoyage' (votre dernier bloc de code) avant de générer les nouveaux conteneurs. C'est parce que vous voulez recycler les contenants disponibles * avant * ils sont nécessaires, pas après. Enregistre quelques créations inutiles. – MarqueIV
Le lien n'est plus disponible. – Djof