共用方式為


回應觸控式鍵盤的出現

瞭解如何在顯示或隱藏觸控式鍵盤時量身打造應用程式的UI。

重要 API

默認版面配置模式中的觸控式鍵盤。

默認版面配置模式中的觸控式鍵盤

觸控式鍵盤可針對支援觸控的裝置啟用文字輸入。 當使用者點選可編輯的輸入字段時,Windows 應用程式文字輸入控件預設會叫用觸控式鍵盤。 當使用者在表單中的控件之間巡覽時,觸控式鍵盤通常會保持可見,但這種行為可能會根據表單中的其他控制項類型而有所不同。

若要在未衍生自標準文字輸入控件的自定義文字輸入控件中支持對應的觸控式鍵盤行為,您必須使用 AutomationPeer 類別來公開控件以Microsoft UI 自動化,並實作正確的 UI 自動化控件模式。 請參閱 鍵盤無障礙功能自訂自動化夥伴

一旦將此支援新增至您的自定義控制項,您就可以適當地回應觸控式鍵盤的存在。

先決條件

本主題是建立在 鍵盤互動的基礎之上。

您應該對標準鍵盤互動、處理鍵盤輸入和事件以及UI自動化有基本的瞭解。

如果您不熟悉開發 Windows 應用程式,請瀏覽這些主題,以熟悉這裡討論的技術。

用戶體驗指導方針:

如需針對鍵盤輸入優化之實用且吸引人的應用程式設計的實用秘訣,請參閱 鍵盤互動

觸控式鍵盤和自定義UI

以下是自定義文字輸入控件的一些基本建議。

  • 在整個與表單的互動中顯示觸控式鍵盤。

  • 確認您的自訂控件具有適當的 UI 自動化 AutomationControlType,以便在文本輸入時,當焦點從文字輸入欄位移動時,鍵盤保持啟用狀態。 例如,如果您在文字輸入情境中間開啟功能表,並且希望鍵盤保持顯示,那麼功能表必須具有 AutomationControlType 的功能表類型。

  • 不要操控 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";
}

範例

存檔樣品