Как указано в других ответах, настройка IsAltKeyRequiredInAccessKeyDefaultScope
позволяет избежать вызова действий для клавиш доступа без нажатия клавиши Alt .Однако это также может привести к отключению клавиши Enter (для вызова действия по умолчанию) и клавиши Esc (для вызова действия Cancel).
Использованиевместо этого предложенный обходной путь и проверка на Key.Enter
и Key.Escape
могут обойти эту проблему.Однако вы можете обнаружить, что пункты меню не могут быть выбраны их клавишей доступа без нажатия клавиши Alt , что может быть проблемой, если кнопка в области видимости использует ту же клавишу доступа.
Тогда альтернативой может быть обработка события ключа доступа путем проверки, находится ли потенциально вызываемый элемент управления AccessText
в пределах MenuItem
или нет, что-то вроде этого:
EventManager.RegisterClassHandler(
typeof(UIElement),
AccessKeyManager.AccessKeyPressedEvent,
new AccessKeyPressedEventHandler(OnAccessKeyPressed));
...
static void OnAccessKeyPressed(object accessKeyTarget, AccessKeyPressedEventArgs e)
{
if (!e.Handled && e.Scope == null &&
(Keyboard.Modifiers & ModifierKeys.Alt) != ModifierKeys.Alt &&
!ShouldElementHandleAccessKeysWhenAltIsNotPressed(accessKeyTarget as UIElement))
{
e.Target = null;
e.Handled = true;
}
}
static bool ShouldElementHandleAccessKeysWhenAltIsNotPressed(UIElement element)
{
if (element == null) return false;
var accessText = element as AccessText;
if (accessText != null && !IsDecendantOfMenuItem(accessText)) return false;
return true;
}
static bool IsDecendantOfMenuItem(DependencyObject element)
{
for (; element != null; element = VisualTreeHelper.GetParent(element))
if (element is MenuItem) return true;
return false;
}