对触摸键盘的存在做出响应

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

重要 API

默认布局模式下的触摸键盘。

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

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

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

在将此支持添加到自定义控件后,可以适时响应触摸键盘的存在。

先决条件

本主题是建立在 键盘交互基础上的。

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

如果你不熟悉开发 Windows 应用,请查看这些主题来熟悉此处讨论的技术。

用户体验指南:

有关设计针对键盘输入优化的有用且引人入胜的应用的有用提示,请参阅 键盘交互

触摸键盘和自定义 UI

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

  • 在整个与表单交互过程中显示触摸键盘。

  • 确保自定义控件具有适当的 UI 自动化 AutomationControlType,以便在文本输入上下文中,当焦点从文本输入字段移开时,键盘能够保持。 例如,如果在文本输入过程中打开了一个菜单,并且希望键盘保持打开状态,那么菜单必须具备“Menu”的自动化控制类型

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

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

    由于触摸键盘遮挡了大部分屏幕,Windows 可确保当用户浏览窗体上的控件(包括当前不在视图中的控件)时,具有焦点的输入字段将滚动到视图中。

    在自定义 UI 时,通过处理 显示隐藏 事件,为触摸键盘的外观提供类似的行为,这些事件由 InputPane 对象公开。

    使用和不使用触摸键盘显示 的窗体

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

    一个窗体,其中包含应始终保留在视野内的区域

处理显示和隐藏事件

下面是附加 显示触摸键盘隐藏 事件的事件处理程序的示例。

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";
}

Samples

档案样本