浏览代码

Implement Home and End navigation.

Steven Kirk 9 年之前
父节点
当前提交
86dfadf514

+ 42 - 30
src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs

@@ -152,6 +152,7 @@ namespace Avalonia.Controls.Presenters
             var generator = Owner.ItemContainerGenerator;
             var panel = VirtualizingPanel;
             var itemIndex = generator.IndexFromContainer(from);
+            var vertical = VirtualizingPanel.ScrollDirection == Orientation.Vertical;
 
             if (itemIndex == -1)
             {
@@ -160,41 +161,52 @@ namespace Avalonia.Controls.Presenters
 
             var newItemIndex = -1;
 
-            if (VirtualizingPanel.ScrollDirection == Orientation.Vertical)
+            switch (direction)
             {
-                switch (direction)
-                {
-                    case NavigationDirection.Up:
+                case NavigationDirection.Up:
+                    if (vertical)
+                    {
                         newItemIndex = itemIndex - 1;
-                        break;
-                    case NavigationDirection.Down:
+                    }
+
+                    break;
+                case NavigationDirection.Down:
+                    if (vertical)
+                    {
                         newItemIndex = itemIndex + 1;
-                        break;
-                    case NavigationDirection.PageUp:
-                        newItemIndex = Math.Max(0, itemIndex - (int)ViewportValue);
-                        break;
-                    case NavigationDirection.PageDown:
-                        newItemIndex = Math.Min(ItemCount - 1, itemIndex + (int)ViewportValue);
-                        break;
-                }
-            }
-            else
-            {
-                switch (direction)
-                {
-                    case NavigationDirection.Left:
+                    }
+
+                    break;
+
+                case NavigationDirection.Left:
+                    if (!vertical)
+                    {
                         newItemIndex = itemIndex - 1;
-                        break;
-                    case NavigationDirection.Right:
+                    }
+                    break;
+
+                case NavigationDirection.Right:
+                    if (!vertical)
+                    {
                         newItemIndex = itemIndex + 1;
-                        break;
-                    case NavigationDirection.PageUp:
-                        newItemIndex = Math.Max(0, itemIndex - (int)ViewportValue);
-                        break;
-                    case NavigationDirection.PageDown:
-                        newItemIndex = Math.Min(ItemCount - 1, itemIndex + (int)ViewportValue);
-                        break;
-                }
+                    }
+                    break;
+
+                case NavigationDirection.PageUp:
+                    newItemIndex = Math.Max(0, itemIndex - (int)ViewportValue);
+                    break;
+
+                case NavigationDirection.PageDown:
+                    newItemIndex = Math.Min(ItemCount - 1, itemIndex + (int)ViewportValue);
+                    break;
+
+                case NavigationDirection.Home:
+                    newItemIndex = 0;
+                    break;
+
+                case NavigationDirection.End:
+                    newItemIndex = ItemCount - 1;
+                    break;
             }
 
             return ScrollIntoView(newItemIndex);

+ 6 - 0
src/Avalonia.Input/KeyboardNavigationHandler.cs

@@ -123,6 +123,12 @@ namespace Avalonia.Input
                     case Key.PageDown:
                         direction = NavigationDirection.PageDown;
                         break;
+                    case Key.Home:
+                        direction = NavigationDirection.Home;
+                        break;
+                    case Key.End:
+                        direction = NavigationDirection.End;
+                        break;
                 }
 
                 if (direction.HasValue)

+ 10 - 0
src/Avalonia.Input/NavigationDirection.cs

@@ -57,5 +57,15 @@ namespace Avalonia.Input
         /// Move the focus down a page.
         /// </summary>
         PageDown,
+
+        /// <summary>
+        /// Move the focus to the first item.
+        /// </summary>
+        Home,
+
+        /// <summary>
+        /// Move the focus to the last item.
+        /// </summary>
+        End,
     }
 }