|
@@ -1,5 +1,6 @@
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
+using System.Globalization;
|
|
|
using System.Linq;
|
|
|
using Avalonia.Interactivity;
|
|
|
using Avalonia.VisualTree;
|
|
@@ -23,7 +24,7 @@ namespace Avalonia.Input
|
|
|
/// <summary>
|
|
|
/// The registered access keys.
|
|
|
/// </summary>
|
|
|
- private readonly List<Tuple<string, IInputElement>> _registered = new List<Tuple<string, IInputElement>>();
|
|
|
+ private readonly List<(string AccessKey, IInputElement Element)> _registered = new();
|
|
|
|
|
|
/// <summary>
|
|
|
/// The window to which the handler belongs.
|
|
@@ -108,12 +109,12 @@ namespace Avalonia.Input
|
|
|
{
|
|
|
var existing = _registered.FirstOrDefault(x => x.Item2 == element);
|
|
|
|
|
|
- if (existing != null)
|
|
|
+ if (existing != default)
|
|
|
{
|
|
|
_registered.Remove(existing);
|
|
|
}
|
|
|
|
|
|
- _registered.Add(Tuple.Create(accessKey.ToString().ToUpper(), element));
|
|
|
+ _registered.Add((accessKey.ToString().ToUpperInvariant(), element));
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -143,7 +144,7 @@ namespace Avalonia.Input
|
|
|
{
|
|
|
// TODO: Use FocusScopes to store the current element and restore it when context menu is closed.
|
|
|
// Save currently focused input element.
|
|
|
- _restoreFocusElement = FocusManager.Instance?.Current;
|
|
|
+ _restoreFocusElement = FocusManager.Instance?.Current;
|
|
|
|
|
|
// When Alt is pressed without a main menu, or with a closed main menu, show
|
|
|
// access key markers in the window (i.e. "_File").
|
|
@@ -180,10 +181,11 @@ namespace Avalonia.Input
|
|
|
{
|
|
|
// If any other key is pressed with the Alt key held down, or the main menu is open,
|
|
|
// find all controls who have registered that access key.
|
|
|
- var text = e.Key.ToString().ToUpper();
|
|
|
+ var text = e.Key.ToString();
|
|
|
var matches = _registered
|
|
|
- .Where(x => x.Item1 == text && ((Visual)x.Item2).IsEffectivelyVisible)
|
|
|
- .Select(x => x.Item2);
|
|
|
+ .Where(x => string.Equals(x.AccessKey, text, StringComparison.OrdinalIgnoreCase)
|
|
|
+ && x.Element.IsEffectivelyVisible)
|
|
|
+ .Select(x => x.Element);
|
|
|
|
|
|
// If the menu is open, only match controls in the menu's visual tree.
|
|
|
if (menuIsOpen)
|
|
@@ -194,7 +196,7 @@ namespace Avalonia.Input
|
|
|
var match = matches.FirstOrDefault();
|
|
|
|
|
|
// If there was a match, raise the AccessKeyPressed event on it.
|
|
|
- if (match != null)
|
|
|
+ if (match is not null)
|
|
|
{
|
|
|
match.RaiseEvent(new RoutedEventArgs(AccessKeyPressedEvent));
|
|
|
e.Handled = true;
|