diff --git a/src/Avalonia.Controls/DropDown.cs b/src/Avalonia.Controls/DropDown.cs
index fa2e0c1e16..6b27c479ba 100644
--- a/src/Avalonia.Controls/DropDown.cs
+++ b/src/Avalonia.Controls/DropDown.cs
@@ -96,6 +96,16 @@ namespace Avalonia.Controls
this.UpdateSelectionBoxItem(this.SelectedItem);
}
+ protected override void OnGotFocus(GotFocusEventArgs e)
+ {
+ base.OnGotFocus(e);
+
+ if (!e.Handled && e.NavigationMethod == NavigationMethod.Directional)
+ {
+ e.Handled = UpdateSelectionFromEventSource(e.Source);
+ }
+ }
+
///
protected override void OnKeyDown(KeyEventArgs e)
{
@@ -104,7 +114,7 @@ namespace Avalonia.Controls
if (!e.Handled)
{
if (e.Key == Key.F4 ||
- (e.Key == Key.Down && ((e.Modifiers & InputModifiers.Alt) != 0)))
+ ((e.Key == Key.Down || e.Key == Key.Up) && ((e.Modifiers & InputModifiers.Alt) != 0)))
{
IsDropDownOpen = !IsDropDownOpen;
e.Handled = true;
@@ -114,6 +124,27 @@ namespace Avalonia.Controls
IsDropDownOpen = false;
e.Handled = true;
}
+
+ if (!IsDropDownOpen)
+ {
+ if (e.Key == Key.Down)
+ {
+ if (SelectedIndex == -1)
+ SelectedIndex = 0;
+
+ if (++SelectedIndex >= ItemCount)
+ SelectedIndex = 0;
+
+ e.Handled = true;
+ }
+ else if (e.Key == Key.Up)
+ {
+ if (--SelectedIndex < 0)
+ SelectedIndex = ItemCount - 1;
+
+ e.Handled = true;
+ }
+ }
}
}
diff --git a/src/Avalonia.Controls/ItemsControl.cs b/src/Avalonia.Controls/ItemsControl.cs
index aa209e0462..4366de1cd6 100644
--- a/src/Avalonia.Controls/ItemsControl.cs
+++ b/src/Avalonia.Controls/ItemsControl.cs
@@ -11,6 +11,7 @@ using Avalonia.Controls.Presenters;
using Avalonia.Controls.Primitives;
using Avalonia.Controls.Templates;
using Avalonia.Controls.Utils;
+using Avalonia.Input;
using Avalonia.LogicalTree;
using Avalonia.Metadata;
@@ -106,6 +107,12 @@ namespace Avalonia.Controls
set { SetAndRaise(ItemsProperty, ref _items, value); }
}
+ public int ItemCount
+ {
+ get;
+ private set;
+ }
+
///
/// Gets or sets the panel used to display the items.
///
@@ -352,6 +359,10 @@ namespace Avalonia.Controls
RemoveControlItemsFromLogicalChildren(e.OldItems);
break;
}
+
+ int? count = (Items as IList)?.Count;
+ if (count != null)
+ ItemCount = (int)count;
var collection = sender as ICollection;
PseudoClasses.Set(":empty", collection == null || collection.Count == 0);