Sicherung
This commit is contained in:
122
AutoCompleteTextBox/Editors/SelectionAdapter.cs
Normal file
122
AutoCompleteTextBox/Editors/SelectionAdapter.cs
Normal file
@@ -0,0 +1,122 @@
|
||||
using System.Diagnostics;
|
||||
using System.Windows.Controls.Primitives;
|
||||
using System.Windows.Input;
|
||||
|
||||
namespace AutoCompleteTextBox.Editors
|
||||
{
|
||||
public class SelectionAdapter
|
||||
{
|
||||
public class PreSelectionAdapterFinishArgs {
|
||||
public EventCause cause;
|
||||
public bool is_cancel;
|
||||
public bool handled;
|
||||
}
|
||||
|
||||
#region "Fields"
|
||||
#endregion
|
||||
|
||||
#region "Constructors"
|
||||
|
||||
public SelectionAdapter(Selector selector)
|
||||
{
|
||||
SelectorControl = selector;
|
||||
SelectorControl.PreviewMouseUp += OnSelectorMouseDown;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region "Events"
|
||||
|
||||
public enum EventCause { Other, PopupClosed, ItemClicked, EnterPressed, EscapePressed, TabPressed, MouseDown}
|
||||
public delegate void CancelEventHandler(EventCause cause);
|
||||
|
||||
public delegate void CommitEventHandler(EventCause cause);
|
||||
|
||||
public delegate void SelectionChangedEventHandler();
|
||||
|
||||
public event CancelEventHandler Cancel;
|
||||
public event CommitEventHandler Commit;
|
||||
public event SelectionChangedEventHandler SelectionChanged;
|
||||
#endregion
|
||||
|
||||
#region "Properties"
|
||||
|
||||
public Selector SelectorControl { get; set; }
|
||||
|
||||
#endregion
|
||||
|
||||
#region "Methods"
|
||||
|
||||
public void HandleKeyDown(KeyEventArgs key)
|
||||
{
|
||||
switch (key.Key)
|
||||
{
|
||||
case Key.Down:
|
||||
IncrementSelection();
|
||||
break;
|
||||
case Key.Up:
|
||||
DecrementSelection();
|
||||
break;
|
||||
case Key.Enter:
|
||||
Commit?.Invoke(EventCause.EnterPressed);
|
||||
|
||||
break;
|
||||
case Key.Escape:
|
||||
Cancel?.Invoke(EventCause.EscapePressed);
|
||||
|
||||
break;
|
||||
case Key.Tab:
|
||||
Commit?.Invoke(EventCause.TabPressed);
|
||||
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
key.Handled = true;
|
||||
}
|
||||
|
||||
private void DecrementSelection()
|
||||
{
|
||||
if (SelectorControl.SelectedIndex == -1)
|
||||
{
|
||||
SelectorControl.SelectedIndex = SelectorControl.Items.Count - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
SelectorControl.SelectedIndex -= 1;
|
||||
}
|
||||
|
||||
SelectionChanged?.Invoke();
|
||||
}
|
||||
|
||||
private void IncrementSelection()
|
||||
{
|
||||
if (SelectorControl.SelectedIndex == SelectorControl.Items.Count - 1)
|
||||
{
|
||||
SelectorControl.SelectedIndex = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
SelectorControl.SelectedIndex += 1;
|
||||
}
|
||||
|
||||
SelectionChanged?.Invoke();
|
||||
}
|
||||
|
||||
private void OnSelectorMouseDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
// If sender is the RepeatButton from the scrollbar we need to
|
||||
// to skip this event otherwise focus get stuck in the RepeatButton
|
||||
// and list is scrolled up or down til the end.
|
||||
if (e.OriginalSource.GetType() != typeof(RepeatButton))
|
||||
{
|
||||
Commit?.Invoke(EventCause.MouseDown);
|
||||
e.Handled = true;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user