Поделиться через


Сочетания клавиш

Акселераторы клавиатуры — это сочетания клавиш, которые повышают удобство использования и специальные возможности приложений многоплатформенного пользовательского интерфейса .NET (.NET MAUI) в Mac Catalyst и Windows, обеспечивая интуитивно понятный способ вызова распространенных действий или команд без прямого перехода к пользовательскому интерфейсу приложения.

Ускоритель клавиатуры состоит из двух компонентов:

  • Модификаторы, включающие SHIFT, CTRL и ALT.
  • Ключи, которые включают буквенно-цифровые ключи и специальные ключи.

В .NET MAUI акселераторы клавиатуры связаны с командами, предоставляемыми в меню, и должны быть указаны с элементом меню. В частности, акселераторы клавиатуры .NET MAUI можно подключить к элементам меню в строке меню в Mac Catalyst и Windows, а также в контекстных меню в Windows. Дополнительные сведения о строках меню см. в разделе "Отображение строки меню" в классическом приложении .NET MAUI. Дополнительные сведения о контекстных меню см. в разделе "Отображение контекстного меню" в классическом приложении .NET MAUI.

На следующих снимках экрана показаны элементы строки меню и элементы контекстного меню, включающие ускорители клавиатуры:

Screenshot of menu bar items that include keyboard accelerators.Screenshot of context menu items that include keyboard accelerators.

Ускоритель клавиатуры представлен классом KeyboardAccelerator , который представляет сочетание клавиш для a MenuFlyoutItem. Класс KeyboardAccelerator определяет следующие свойства:

  • Modifiers, тип KeyboardAcceleratorModifiers, представляющий значение модификатора, например CTRL или SHIFT, для сочетания клавиш.
  • Keystring?тип , представляющий значение ключа для сочетания клавиш.

Эти свойства поддерживаются объектами, что означает, что они могут быть целевыми BindableProperty объектами привязок данных.

Перечисление KeyboardAcceleratorModifiers определяет следующие элементы, которые используются в качестве значений Modifiers для свойства:

  • None, который указывает, что модификатор не указан.
  • Shift, указывающий модификатор SHIFT в Mac Catalyst и Windows.
  • Ctrl, указывающий модификатор элемента управления в Mac Catalyst и Windows.
  • Alt, указывающий модификатор параметров в Mac Catalyst и модификатор меню в Windows.
  • Cmd, указывающий модификатор команд в Mac Catalyst.
  • Windows, указывающий модификатор Windows в Windows.

Важно!

Ускорители клавиатуры можно подключить к MenuFlyoutItem объектам в MenuBarItem Mac Catalyst и Windows, а также в MenuFlyout Windows.

В следующей таблице описаны форматы акселератора клавиатуры .NET MAUI:

Платформа Один ключ Многоключевой ключ
Mac Catalyst Ускорители клавиатуры без модификатора с одним ключом. Например, с помощью клавиши F1 для вызова действия, связанного с элементом меню. Ускорители клавиатуры с одним или несколькими модификаторами с одним ключом. Например, использование CMD+SHIFT+S или CMD+S для вызова действия, связанного с элементом меню.
Windows Ускорители клавиатуры с модификатором и без нее с одним ключом. Например, с помощью клавиши F1 для вызова действия, связанного с элементом меню. Ускорители клавиатуры с одним или несколькими модификаторами с одним ключом. Например, с помощью КЛАВИШ CTRL+SHIFT+F или CTRL+F для вызова действия, связанного с элементом меню.

Создание акселератора клавиатуры

К KeyboardAccelerator ней MenuFlyoutItem можно подключиться, добавив ее в коллекцию KeyboardAccelerators :

<MenuFlyoutItem Text="Cut"
                Clicked="OnCutMenuFlyoutItemClicked">
    <MenuFlyoutItem.KeyboardAccelerators>
        <KeyboardAccelerator Modifiers="Ctrl"
                             Key="X" />
    </MenuFlyoutItem.KeyboardAccelerators>
</MenuFlyoutItem>

Ускорители клавиатуры также можно указать в коде:

cutMenuFlyoutItem.KeyboardAccelerators.Add(new KeyboardAccelerator
{
    Modifiers = KeyboardAcceleratorModifiers.Ctrl,
    Key = "X"
});

При нажатии модификатора ускорителя клавиатуры и нажатия клавиши вызывается действие, связанное с ним MenuFlyoutItem .

Важно!

Хотя в коллекцию можно добавить MenuFlyoutItem.KeyboardAccelerators несколько KeyboardAccelerator объектов, в коллекции будет отображаться MenuFlyoutItemтолько первый KeyboardAccelerator элемент коллекции. Кроме того, в Mac Catalyst только сочетание клавиш для первого KeyboardAccelerator в коллекции приведет к вызову действия, связанного с вызываемой MenuFlyoutItem . Однако в Windows сочетания клавиш для всех KeyboardAccelerator объектов в MenuFlyoutItem.KeyboardAccelerators коллекции вызываются MenuFlyoutItem .

Указание нескольких модификаторов

На обеих платформах можно указать KeyboardAccelerator несколько модификаторов:

<MenuFlyoutItem Text="Refresh"
                Command="{Binding RefreshCommand}">
    <MenuFlyoutItem.KeyboardAccelerators>
        <KeyboardAccelerator Modifiers="Shift,Ctrl"
                             Key="R" />
    </MenuFlyoutItem.KeyboardAccelerators>
</MenuFlyoutItem>

Эквивалентный код на C# выглядит так:

refreshMenuFlyoutItem.KeyboardAccelerators.Add(new KeyboardAccelerator
{
    Modifiers = KeyboardAcceleratorModifiers.Shift | KeyboardAcceleratorModifiers.Ctrl,
    Key = "R"
});

Указание акселераторов клавиатуры на платформу

Различные модификаторы и клавиши акселератора клавиатуры можно указать на каждую платформу в XAML с расширением OnPlatform разметки:

<MenuFlyoutItem Text="Change Theme"
                Command="{Binding ChangeThemeCommand}">
    <MenuFlyoutItem.KeyboardAccelerators>
        <KeyboardAccelerator Modifiers="{OnPlatform MacCatalyst=Cmd, WinUI=Windows}"
                             Key="{OnPlatform MacCatalyst=T, WinUI=C}" />
    </MenuFlyoutItem.KeyboardAccelerators>
</MenuFlyoutItem>

Эквивалентный код на C# выглядит так:

KeyboardAcceleratorModifiers modifier = KeyboardAcceleratorModifiers.None;
string key = string.Empty;

if (DeviceInfo.Current.Platform == DevicePlatform.MacCatalyst)
{
    modifier = KeyboardAcceleratorModifiers.Cmd;
    key = "T";
}
else if (DeviceInfo.Current.Platform == DevicePlatform.WinUI)
{
    modifier = KeyboardAcceleratorModifiers.Windows;
    key = "C";
}

myMenuFlyoutItem.KeyboardAccelerators.Add(new KeyboardAccelerator
{
    Modifiers = modifier,
    Key = key
});

Использование специальных клавиш в акселераторе клавиатуры

В Windows специальные ключи можно указать с помощью строковой константы или целого числа. Список констант и целых чисел см. в VirtualKeyтаблице.

Примечание.

В Windows поддерживаются акселераторы с одним ключом (все буквенно-цифровые и знаки препинания, delete, F2, Пробел, Esc, Мультимедиа Key) и многоключевые акселераторы (CTRL+SHIFT+M). Однако виртуальные ключи Gamepad не поддерживаются.

В Mac Catalyst специальные ключи можно указать с помощью строковой константы. Список констант, представляющих текстовые входные строки, соответствующие специальным ключам, см. в разделе Входные строки для специальных ключей на developer.apple.com.

В следующем XAML показан пример определения акселератора клавиатуры, использующего специальный ключ:

<MenuFlyoutItem Text="Help"
                Command="{Binding HelpCommand}">
    <MenuFlyoutItem.KeyboardAccelerators>
        <!-- Alternatively, 112 can be used to specify F1 on Windows -->
        <KeyboardAccelerator Modifiers="None"
                             Key="{OnPlatform MacCatalyst=UIKeyInputF1, WinUI=F1}" />
    </MenuFlyoutItem.KeyboardAccelerators>
</MenuFlyoutItem>

В этом примере ускоритель клавиатуры — это клавиша F1, которая указывается с помощью константы на обеих платформах. В Windows он также может быть указан целым числом 112.

Локализация аклератора клавиатуры

Клавиши акселератора клавиатуры можно локализовать с помощью файла ресурсов .NET. Затем локализованный ключ можно получить с помощью x:Static расширения разметки:

<MenuFlyoutItem Text="Cut"
                Clicked="OnCutMenuFlyoutItemClicked">
    <MenuFlyoutItem.KeyboardAccelerators>
        <KeyboardAccelerator Modifiers="Ctrl"
                             Key="{x:Static local:AppResources.CutAcceleratorKey}" />
    </MenuFlyoutItem.KeyboardAccelerators>
</MenuFlyoutItem>

Подробнее об этом см. в разделе Локализация.

Отключение акселератора клавиатуры

При отключении связанный MenuFlyoutItem акселератор клавиатуры также отключен:

<MenuFlyoutItem Text="Cut"
                Clicked="OnCutMenuFlyoutItemClicked"
                IsEnabled="false">
    <MenuFlyoutItem.KeyboardAccelerators>
        <KeyboardAccelerator Modifiers="Ctrl"
                             Key="X" />
    </MenuFlyoutItem.KeyboardAccelerators>
</MenuFlyoutItem>

В этом примере, поскольку IsEnabled для свойства задано falseзначениеMenuFlyoutItem, не удается вызвать связанный ускоритель клавиатуры CTRL+X.