响应触摸键盘的存在

了解如何定制在显示或隐藏触控键盘时的应用 UI。

重要的 API

The touch keyboard in default layout mode.

默认布局模式中的触摸键盘

触控键盘可为支持触控的设备启用文本输入。 当用户点击可编辑的输入字段时,Windows 应用文本输入控件会默认调用触摸键盘。 当用户在窗体中的控件之间导航时,触控键盘通常会保持可见,但这种行为可能因窗体中的其他控件类型而异。

若要在未派生自标准文本输入控件的自定义文本输入控件中支持相应的触控键盘行为,您必须使用 AutomationPeer 类向 Microsoft UI 自动化公开控件并实现正确的UI 自动化控件模式。 请参阅键盘辅助功能自定义自动化对等

在将此支持添加到自定义控件后,就可以对触控键盘的存在做出适当的响应。

先决条件:

本主题基于键盘交互

您应该对标准键盘交互、处理键盘输入和事件以及 UI 自动化有基本的了解。

如果你还不熟悉 Windows 应用开发,请仔细阅读这些主题来熟悉此处讨论的技术。

用户体验指南:

有关于设计出既实用又有吸引力且已针对键盘输入进行优化的应用的有用提示,请参阅键盘交互

触控键盘和自定义 UI

以下是一些关于自定义文本输入控件的基本建议。

  • 在与窗体交互的整个过程中显示触控键盘。

  • 确保自定义控件具有适当的 UI 自动化AutomationControlType,以便键盘在文本输入上下文中从文本输入字段移动焦点时键盘会保留。 例如,如果在文本输入场景中打开了一个菜单,并且希望键盘得以保留,则菜单的 AutomationControlType 必须为 Menu。

  • 不要操作 UI 自动化属性来控制触控键盘。 其他辅助功能工具依赖于UI 自动化属性的准确性。

  • 确保用户始终可以看到他们正在与之交互的输入字段。

    触摸键盘会遮挡住大部分屏幕,不过 Windows 可确保当用户在表单上的不同控件(包括当前不在视图中的控件)之间导航时,具有焦点的输入字段滚动到视图中。

    在自定义 UI 时,通过处理 InputPane 对象暴露的显示隐藏事件,为触控键盘的外观提供类似的行为。

    a form with and without the touch keyboard showing

    在某些情况下,有些 UI 元素应一直保留在屏幕上。 设计 UI,以便窗体控件包含在平移区域中,并且重要的 UI 元素应保持静态。 例如:

    a form that contains areas that should always stay in view

处理显示和隐藏事件

下面是关于附加触摸键盘的 showinghiding 事件的事件处理程序的示例。

using Windows.UI.ViewManagement;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media;
using Windows.Foundation;
using Windows.UI.Xaml.Navigation;

namespace SDKTemplate
{
    /// <summary>
    /// Sample page to subscribe show/hide event of Touch Keyboard.
    /// </summary>
    public sealed partial class Scenario2_ShowHideEvents : Page
    {
        public Scenario2_ShowHideEvents()
        {
            this.InitializeComponent();
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            InputPane currentInputPane = InputPane.GetForCurrentView();
            // Subscribe to Showing/Hiding events
            currentInputPane.Showing += OnShowing;
            currentInputPane.Hiding += OnHiding;
        }

        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            InputPane currentInputPane = InputPane.GetForCurrentView();
            // Unsubscribe from Showing/Hiding events
            currentInputPane.Showing -= OnShowing;
            currentInputPane.Hiding -= OnHiding;
        }

        void OnShowing(InputPane sender, InputPaneVisibilityEventArgs e)
        {
            LastInputPaneEventRun.Text = "Showing";
        }
        
        void OnHiding(InputPane sender, InputPaneVisibilityEventArgs e)
        {
            LastInputPaneEventRun.Text = "Hiding";
        }
    }
}
...
#include <winrt/Windows.UI.ViewManagement.h>
...
private:
    winrt::event_token m_showingEventToken;
    winrt::event_token m_hidingEventToken;
...
Scenario2_ShowHideEvents::Scenario2_ShowHideEvents()
{
    InitializeComponent();
}

void Scenario2_ShowHideEvents::OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs const& e)
{
    auto inputPane{ Windows::UI::ViewManagement::InputPane::GetForCurrentView() };
    // Subscribe to Showing/Hiding events
    m_showingEventToken = inputPane.Showing({ this, &Scenario2_ShowHideEvents::OnShowing });
    m_hidingEventToken = inputPane.Hiding({ this, &Scenario2_ShowHideEvents::OnHiding });
}

void Scenario2_ShowHideEvents::OnNavigatedFrom(Windows::UI::Xaml::Navigation::NavigationEventArgs const& e)
{
    auto inputPane{ Windows::UI::ViewManagement::InputPane::GetForCurrentView() };
    // Unsubscribe from Showing/Hiding events
    inputPane.Showing(m_showingEventToken);
    inputPane.Hiding(m_hidingEventToken);
}

void Scenario2_ShowHideEvents::OnShowing(Windows::UI::ViewManagement::InputPane const& /*sender*/, Windows::UI::ViewManagement::InputPaneVisibilityEventArgs const& /*args*/)
{
    LastInputPaneEventRun().Text(L"Showing");
}

void Scenario2_ShowHideEvents::OnHiding(Windows::UI::ViewManagement::InputPane const& /*sender*/, Windows::UI::ViewManagement::InputPaneVisibilityEventArgs const& /*args*/)
{
    LastInputPaneEventRun().Text(L"Hiding");
}
#include "pch.h"
#include "Scenario2_ShowHideEvents.xaml.h"

using namespace SDKTemplate;
using namespace Platform;
using namespace Windows::Foundation;
using namespace Windows::UI::ViewManagement;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Controls;
using namespace Windows::UI::Xaml::Navigation;

Scenario2_ShowHideEvents::Scenario2_ShowHideEvents()
{
    InitializeComponent();
}

void Scenario2_ShowHideEvents::OnNavigatedTo(NavigationEventArgs^ e)
{
    auto inputPane = InputPane::GetForCurrentView();
    // Subscribe to Showing/Hiding events
    showingEventToken = inputPane->Showing +=
        ref new TypedEventHandler<InputPane^, InputPaneVisibilityEventArgs^>(this, &Scenario2_ShowHideEvents::OnShowing);
    hidingEventToken = inputPane->Hiding +=
        ref new TypedEventHandler<InputPane^, InputPaneVisibilityEventArgs^>(this, &Scenario2_ShowHideEvents::OnHiding);
}

void Scenario2_ShowHideEvents::OnNavigatedFrom(NavigationEventArgs^ e)
{
    auto inputPane = Windows::UI::ViewManagement::InputPane::GetForCurrentView();
    // Unsubscribe from Showing/Hiding events
    inputPane->Showing -= showingEventToken;
    inputPane->Hiding -= hidingEventToken;
}

void Scenario2_ShowHideEvents::OnShowing(InputPane^ /*sender*/, InputPaneVisibilityEventArgs^ /*args*/)
{
    LastInputPaneEventRun->Text = L"Showing";
}

void Scenario2_ShowHideEvents::OnHiding(InputPane^ /*sender*/, InputPaneVisibilityEventArgs ^ /*args*/)
{
    LastInputPaneEventRun->Text = L"Hiding";
}

示例

存档示例