Andrey Kunchev 7 years ago
parent
commit
5c74c49a0a

+ 23 - 1
src/Avalonia.Base/Utilities/MathUtilities.cs

@@ -1,7 +1,6 @@
 // Copyright (c) The Avalonia Project. All rights reserved.
 // Licensed under the MIT license. See licence.md file in the project root for full license information.
 
-
 namespace Avalonia.Utilities
 {
     /// <summary>
@@ -31,5 +30,28 @@ namespace Avalonia.Utilities
                 return val;
             }
         }
+
+        /// <summary>
+        /// Clamps a value between a minimum and maximum value.
+        /// </summary>
+        /// <param name="val">The value.</param>
+        /// <param name="min">The minimum value.</param>
+        /// <param name="max">The maximum value.</param>
+        /// <returns>The clamped value.</returns>
+        public static int Clamp(int val, int min, int max)
+        {
+            if (val < min)
+            {
+                return min;
+            }
+            else if (val > max)
+            {
+                return max;
+            }
+            else
+            {
+                return val;
+            }
+        }
     }
 }

+ 1 - 11
src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs

@@ -418,17 +418,7 @@ namespace Avalonia.Controls.Presenters
             var selector = Owner.MemberSelector;
 
             //validate delta it should never overflow last index or generate index < 0 
-            if (delta > 0)
-            {
-                if ((FirstIndex + delta + panel.Children.Count) > ItemCount)
-                {
-                    delta = ItemCount - FirstIndex - panel.Children.Count;
-                }
-            }
-            else if ((FirstIndex + delta) < 0)
-            {
-                delta = -FirstIndex;
-            }
+            delta = MathUtilities.Clamp(delta, -FirstIndex, ItemCount - FirstIndex - panel.Children.Count);
 
             var sign = delta < 0 ? -1 : 1;
             var count = Math.Min(Math.Abs(delta), panel.Children.Count);