Реакция на наличие сенсорной клавиатуры

Узнайте, как настроить пользовательский интерфейс приложения при отображении или скрытии сенсорной клавиатуры.

Важные API

The touch keyboard in default layout mode.

Сенсорный клавиатура в режиме макета по умолчанию

Сенсорный клавиатура позволяет вводить текст для устройств, поддерживающих сенсорный ввод. Элементы управления вводом текста в приложении Windows вызывают сенсорную клавиатуру по умолчанию, когда пользователь нажимает на редактируемое поле ввода. Сенсорная клавиатура обычно остается видимой, пока пользователь перемещается между элементами управления в форме, но это поведение может отличаться в зависимости от других типов элементов управления в форме.

Для поддержки соответствующего поведения сенсорной клавиатуры в пользовательском элементе управления вводом текста, который не является производным от стандартного элемента управления вводом текста, необходимо использовать класс AutomationPeer для предоставления элементов управления Microsoft модель автоматизации пользовательского интерфейса и реализации правильности. модель автоматизации пользовательского интерфейса шаблонов элементов управления. Дополнительные сведения см. в разделе "Специальные возможности клавиатуры" и "Пользовательские одноранговые узлы автоматизации".

После добавления этой поддержки в пользовательский элемент управления можно соответствующим образом реагировать на наличие сенсорной клавиатуры.

Необходимые условия:

В этом разделе описано взаимодействие с клавиатурой.

Вы должны иметь базовое представление о стандартном взаимодействии с клавиатурой, обработке ввода и событий клавиатуры, а также модель автоматизации пользовательского интерфейса.

Если вы не знакомы с разработкой приложений Windows, ознакомьтесь с этими разделами, чтобы ознакомиться с технологиями, описанными здесь.

Рекомендации по работе с пользователем:

Полезные советы по проектированию полезного и привлекательного приложения, оптимизированного для ввода клавиатуры, см. в разделе "Взаимодействие с клавиатурой ".

Сенсорная клавиатура и пользовательский интерфейс

Ниже приведены несколько основных рекомендаций для пользовательских элементов управления вводом текста.

  • Отображение сенсорной клавиатуры во всем взаимодействии с формой.

  • Убедитесь, что пользовательские элементы управления имеют соответствующий модель автоматизации пользовательского интерфейса AutomationControlType, чтобы клавиатура сохранялась при переходе фокуса из поля ввода текста в контексте записи текста. Например, если у вас есть меню, открытое в середине сценария ввода текста, и вы хотите сохранить клавиатуру, меню должно иметь AutomationControlType меню меню.

  • Не управляйте свойствами модель автоматизации пользовательского интерфейса для управления сенсорной клавиатурой. Другие средства специальных возможностей зависят от точности свойств модель автоматизации пользовательского интерфейса.

  • Убедитесь, что пользователи всегда могут видеть поле ввода, с которым они взаимодействуют.

    Так как сенсорный клавиатура occludes большой части экрана, Windows гарантирует, что поле ввода с фокусом прокручивается в представлении, как пользователь перемещается по элементам управления в форме, включая элементы управления, которые в настоящее время не находятся в представлении.

    При настройке пользовательского интерфейса укажите аналогичное поведение при появлении сенсорной клавиатуры, обрабатывая события отображения и скрытия , предоставляемые объектом InputPane .

    a form with and without the touch keyboard showing

    В некоторых случаях есть элементы пользовательского интерфейса, которые должны оставаться на экране в течение всего времени. Создайте пользовательский интерфейс таким образом, чтобы элементы управления формами содержали в области сдвига, а важные элементы пользовательского интерфейса являются статическими. Например:

    a form that contains areas that should always stay in view

Обработка событий отображения и скрытия

Ниже приведен пример подключения обработчиков событий для отображения и скрытия событий сенсорной клавиатуры.

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

Примеры

Архивные примеры