protected override void OnKeyDown(KeyEventArgs e)
{
if (e.Key == Key.Down)
{
Debug.WriteLine("Down pressed. FocusedElement - " + Keyboard.FocusedElement);
if ((Menu != null) && Menu.Items.Contains(Menu.ItemContainerGenerator.ItemFromContainer(Keyboard.FocusedElement as DependencyObject)))
{
int indexOfMSelectedItem = Menu.ItemContainerGenerator.IndexFromContainer(Keyboard.FocusedElement as DependencyObject);
if (indexOfMSelectedItem != Menu.Items.Count - 1)
{
Keyboard.Focus(Menu.ItemContainerGenerator.ContainerFromIndex(indexOfMSelectedItem + 1) as IInputElement);
}
else
{
if ((Items.Count > 0) && (!IsEditable))
{
Keyboard.Focus(ItemContainerGenerator.ContainerFromIndex(0) as IInputElement);
}
else Keyboard.Focus(Menu.Items[0] as IInputElement);
}
}
else if (Items.Contains(ItemContainerGenerator.ItemFromContainer(Keyboard.FocusedElement as DependencyObject)))
{
int indexOfSelectedItem = ItemContainerGenerator.IndexFromContainer(Keyboard.FocusedElement as DependencyObject);
if (indexOfSelectedItem != Items.Count - 1)
{
Keyboard.Focus(ItemContainerGenerator.ContainerFromIndex(indexOfSelectedItem + 1) as IInputElement);
}
else
{
if ((Menu != null) && (Menu.Items.Count > 0) && (!IsEditable)) Keyboard.Focus(Menu.ItemContainerGenerator.ContainerFromIndex(0) as IInputElement);
else
{
Keyboard.Focus(ItemContainerGenerator.ContainerFromIndex(0) as IInputElement);
}
}
}
else if (SelectedItem != null) Keyboard.Focus(ItemContainerGenerator.ContainerFromItem(SelectedItem) as IInputElement);
e.Handled = true;
Debug.WriteLine("FocusedElement - " + Keyboard.FocusedElement);
return;
}
else if (e.Key == Key.Up)
{
Debug.WriteLine("Up pressed. FocusedElement - " + Keyboard.FocusedElement);
if ((Menu != null) && Menu.Items.Contains(Menu.ItemContainerGenerator.ItemFromContainer(Keyboard.FocusedElement as DependencyObject)))
{
int indexOfMSelectedItem = Menu.ItemContainerGenerator.IndexFromContainer(Keyboard.FocusedElement as DependencyObject);
if (indexOfMSelectedItem != 0)
{
Keyboard.Focus(Menu.ItemContainerGenerator.ContainerFromIndex(indexOfMSelectedItem - 1) as IInputElement);
}
else
{
if ((Items.Count > 0) && (!IsEditable))
{
Keyboard.Focus(ItemContainerGenerator.ContainerFromIndex(Items.Count - 1) as IInputElement);
}
else Keyboard.Focus(Menu.Items[Menu.Items.Count - 1] as IInputElement);
}
}
else if (Items.Contains(ItemContainerGenerator.ItemFromContainer(Keyboard.FocusedElement as DependencyObject)))
{
int indexOfSelectedItem = ItemContainerGenerator.IndexFromContainer(Keyboard.FocusedElement as DependencyObject);
if (indexOfSelectedItem != 0)
{
Keyboard.Focus(ItemContainerGenerator.ContainerFromIndex(indexOfSelectedItem - 1) as IInputElement);
}
else
{
if ((Menu != null) && (Menu.Items.Count > 0) && (!IsEditable)) Keyboard.Focus(Menu.ItemContainerGenerator.ContainerFromIndex(Menu.Items.Count - 1) as IInputElement);
else
{
Keyboard.Focus(ItemContainerGenerator.ContainerFromIndex(Items.Count - 1) as IInputElement);
}
}
}
else if (SelectedItem != null) Keyboard.Focus(ItemContainerGenerator.ContainerFromItem(SelectedItem) as IInputElement);
Debug.WriteLine("FocusedElement - " + Keyboard.FocusedElement);
e.Handled = true;
return;
}
else if ((e.Key == Key.Return) && (!IsEditable) && this.IsDropDownOpen)
{
var element = Keyboard.FocusedElement as DependencyObject;
// only try to select if we got a focusedElement
if (element != null)
{
var newSelectedIndex = ItemContainerGenerator.IndexFromContainer(element);
// only set the selected index if the focused element was in a container in this combobox
if (newSelectedIndex > -1)
{
SelectedIndex = newSelectedIndex;
}
}
}
base.OnKeyDown(e);
}