使用 Key Manipulator

使用 Key Manipulator 来设置用户可以用来导航您的应用程序的键。例如,您可以覆盖默认的焦点导航键,并使用特定键将焦点设置到一个节点,设置一个键来打开或关闭弹出类型的窗口,或在焦点链中移动焦点。

默认键盘导航键

这些是可用于在您的应用程序中移动焦点的默认键盘键:

  • 按下 Tab 键向前导航,按下 BackTab 键或 Shift Tab 键向后导航。

  • Button 节点默认启用 Focusable 属性,并且可以接收焦点。当 Button 节点获得焦点时,要按下该按钮,您可以使用数字键盘上的默认键 Space、Enter 和 Enter。

  • Toggle Button 节点启用了 Focusable 属性,并且默认情况下可以接收焦点。当 Toggle Button 节点具有焦点时,要按下该按钮,您可以使用数字键盘上的默认键 Space、Enter 和 Enter。

  • Slider 节点启用了 Focusable 属性,并且默认情况下可以接收焦点。当 Slider 节点具有焦点时,要移动该滑块的旋钮,您可以使用这些默认键盘键:

    • Home 将滑块旋钮移动到轨道的起始位置。

    • End 将滑块旋钮移动到轨道的末端。

    • ← 和 → 用于移动水平滑块的旋钮。

    • ↑ 和 ↓ 用于移动垂直滑块的旋钮。

    要使用箭头键盘键移动滑块旋钮,请在该 Slider 节点中使用 Step Value 属性设置每次按键时旋钮移动的量。

  • 您在 Kanzi Studio 中创建的 Scroll View 节点默认启用 Focusable 属性,并且可以接收焦点。当 Scroll View 节点具有焦点时,要滚动该节点,您可以使用默认的键盘键 ←、→、↑ 和 ↓。

  • 当 List Box 节点具有焦点时,您可以使用以下默认键盘按键在可聚焦的列表项之间导航:

    • 在沿 y 轴滚动的列表框中,使用 ↑ 和 ↓ 在可聚焦项之间移动焦点。

    • 在沿 x 轴滚动的列表框中,使用 → 和 ← 在可聚焦项之间移动焦点。

    • 使用 Home 将焦点移到第一个可聚焦项。

    • 使用 End 将焦点移到最后一个可聚焦项。

    • 在网格列表框节点中,使用 Page Up 和 Page Down 将焦点向后或向前移动一页。一页对应于网格列表框节点可见区域的大小。

    请参阅 在 List Box 节点中处理键焦点。。

  • 当 Text Box 节点处于编辑状态时,要在该文本框中移动光标,您可以使用这些默认键盘键:

    • ← 将光标向后移动一个字符。

    • → 将光标向前移动一个字符。

    • Ctrl ← 将光标移动到光标前的单词边界。

    • Ctrl → 将光标移动到光标后面的单词边界。

    • Home 将光标移动到文本内容的开头。

    • End 将光标移动到文本内容的末尾。

    当 Text Box 节点处于编辑状态时,要修改该文本框中的文本选择,您可以使用这些默认键盘键:

    • Shift ← 将文本选择中的活动光标向后移动一个字符。

    • Shift Ctrl 将活动光标在文本选择中移动到当前光标位置之前的单词边界。

    • Shift Home 将文本选择中的活动光标移动到文本内容的开头。

    • Shift → 将文本选择中的活动光标向前移动一个字符。

    • Shift Ctrl → 将活动光标在文本选择中移动到当前位置之后的单词边界。

    • Shift End 将活动光标在文本选择中移动到文本内容的末尾。

    • Ctrl A 以选择所有文本。

使用 Key Manipulator 触发器

使用 Key Manipulator 触发器在用户按下或释放键时做出反应。例如,您可以覆盖默认的焦点导航键,并使用特定键将焦点设置到一个节点、显示或隐藏一个覆盖层,或在焦点链中移动焦点。请参阅 默认键盘导航键。

Key Manipulator 具有以下触发器:

  • 当用户按下键盘上的特定键时,Key Pressed 触发器被激活。

  • 当用户释放键盘上的特定键时,Key Released 触发器被激活。

  • 当用户取消按键手势时,Key Canceled 触发器被激活。

要使用 Key Manipulator 触发器:

  1. 添加并配置一个 Key Manipulator:

    1. 选择一个您希望从特定键接收输入的节点。

      例如,要隐藏具有特定键的覆盖层,请选择表示该覆盖层的节点。当您隐藏覆盖层时,Kanzi 将焦点移动到先前聚焦的用户界面元素。请参阅 使用焦点。

      ../../_images/popup.png
    2. 在 Node Components 按 Alt 并右键单击 Input Manipulators 中,选择 Key Manipulator。

      使用 Key Manipulator 将节点设置为对按键输入做出反应。

      ../../_images/select-key-manipulator.png
    3. 在 Key Manipulator 集中:

      • Logical Key 到您希望节点响应的键。

        例如,要在用户按下 Enter 键时隐藏叠加层,请将 Logical Key 设置为 Enter。

      • 将 (可选) Key Modifiers 设置为您希望节点响应的修饰键。

        例如,要设置节点在用户按下 Ctrl 键和您在 Logical Key 属性中设置的键时做出反应,请将 Key Modifiers 设置为 Control。

      ../../_images/set-logical-key.png
  2. 在 Node Components 中添加一个 Key Manipulator 触发器。

    例如:在 Node Components 按 Alt 并右键单击 Triggers 中,选择 Message Trigger > Key Input > Key Pressed。

    ../../_images/key-pressed.png
  3. 要在用户按下键时关闭覆盖层,请在 Key Pressed 触发器中创建一个隐藏覆盖层的动作。请参阅 创建叠加层。

    ../../_images/set-visible-false.png
  4. (可选) 要设置 Key Pressed 触发器如何处理按键重复,在触发器中为 Is Repeat 消息参数的值定义一个触发条件。Is Repeat 消息参数指示按键是否是由于用户按住键而导致的重复。

    例如,如果您将覆盖设置为在用户按下相同键时同时打开和关闭,请在 Key Pressed 触发器中创建一个 Trigger Condition,并在条件中设置:

    • A

      • Type of A 到 Message argument

      • Message Argument 到 Is Repeat

    • Operation 到 =

    • B

      • Type of B 到 Fixed

      • Fixed Value 禁用

    通过此条件,您可以设置触发器来处理第一次按键。这样,如果应用程序用户按住键不放,覆盖层不会反复打开和关闭。

    ../../_images/key-pressed-create-condition.png ../../_images/is-repeat-condition.png

当用户按下您在 Key Manipulator (Enter) 中设置的键时,Key Pressed 触发器会启动关闭覆盖层的操作,并将焦点设置到先前聚焦的用户界面元素。

使用 API 中的 key manipulator

要处理 A 键的按下和释放:

auto keyManipulator = KeyManipulator::create(getDomain());
anyNode->addInputManipulator(keyManipulator);
keyManipulator->setKey(LogicalKey::A);

auto onKeyPressed = [](auto&)
{
    // Handle the key press.
};
anyNode->addMessageHandler(KeyManipulator::KeyPressedMessage, onKeyPressed);
auto onKeyReleased = [](auto&)
{
    // Handle the key release.
};
anyNode->addMessageHandler(KeyManipulator::KeyReleasedMessage, onKeyReleased);

要将左 Ctrl 修饰键作为按键手势处理:

keyManipulator->setKey(LogicalKey::LeftControl);

要处理由 Shift A 键组成的按键手势:

keyManipulator->setKey(LogicalKey::A, KeyModifier::Shift);

要处理 Left Alt 和 Left Ctrl 修饰键,请将 Left Alt 键设置为修饰键:

keyManipulator->setKey(LogicalKey::LeftControl, KeyModifier::LeftAlt);

按键顺序很重要。先按下 Left Ctrl 然后按下 Left Alt 与先按下 Left Alt,然后按下 Left Ctrl 的按键手势不同。要处理 Left Ctrl + Left Alt 按键手势:

keyManipulator->setKey(LogicalKey::LeftAlt, KeyModifier::LeftControl);

有关详细信息,请参阅 KeyManipulator 类。

另请参阅

处理用户输入

使用焦点

使用 Navigation Manipulator

使用触发器

教程:为应用程序创建 UI 导航