浏览代码

Make logic a bit clearer.

Steven Kirk 2 年之前
父节点
当前提交
08f90dcad6
共有 1 个文件被更改,包括 18 次插入9 次删除
  1. 18 9
      src/Avalonia.Controls/VirtualizingStackPanel.cs

+ 18 - 9
src/Avalonia.Controls/VirtualizingStackPanel.cs

@@ -428,7 +428,8 @@ namespace Avalonia.Controls
 
 
         private Control GetOrCreateElement(IList items, int index)
         private Control GetOrCreateElement(IList items, int index)
         {
         {
-            var e = GetRealizedElement(index) ?? 
+            var e = GetRealizedElement(index) ??
+                GetItemIsOwnContainer(items, index) ??
                 GetRecycledElement(items, index) ??
                 GetRecycledElement(items, index) ??
                 CreateElement(items, index);
                 CreateElement(items, index);
             InvalidateHack(e);
             InvalidateHack(e);
@@ -442,15 +443,12 @@ namespace Avalonia.Controls
             return _realizedElements?.GetElement(index);
             return _realizedElements?.GetElement(index);
         }
         }
 
 
-        private Control? GetRecycledElement(IList items, int index)
+        private Control? GetItemIsOwnContainer(IList items, int index)
         {
         {
-            Debug.Assert(ItemsControl is not null);
-
-            var generator = ItemsControl!.ItemContainerGenerator;
-            var item = items[index];
-
-            if (item is Control controlItem)
+            if (items[index] is Control controlItem)
             {
             {
+                var generator = ItemsControl!.ItemContainerGenerator;
+
                 if (controlItem.IsSet(ItemIsOwnContainerProperty))
                 if (controlItem.IsSet(ItemIsOwnContainerProperty))
                 {
                 {
                     controlItem.IsVisible = true;
                     controlItem.IsVisible = true;
@@ -459,12 +457,23 @@ namespace Avalonia.Controls
                 else if (generator.IsItemItsOwnContainer(controlItem))
                 else if (generator.IsItemItsOwnContainer(controlItem))
                 {
                 {
                     AddInternalChild(controlItem);
                     AddInternalChild(controlItem);
-                    generator.PrepareItemContainer(controlItem, item, index);
+                    generator.PrepareItemContainer(controlItem, controlItem, index);
                     controlItem.SetValue(ItemIsOwnContainerProperty, true);
                     controlItem.SetValue(ItemIsOwnContainerProperty, true);
                     return controlItem;
                     return controlItem;
                 }
                 }
             }
             }
 
 
+            return null;
+        }
+
+        private Control? GetRecycledElement(IList items, int index)
+        {
+            Debug.Assert(ItemsControl is not null);
+
+            var generator = ItemsControl!.ItemContainerGenerator;
+            var item = items[index];
+
+
             if (_recyclePool?.Count > 0)
             if (_recyclePool?.Count > 0)
             {
             {
                 var recycled = _recyclePool.Pop();
                 var recycled = _recyclePool.Pop();