【问题标题】:Show/Hide Keyboard programmatically on windows8在 Windows 8 上以编程方式显示/隐藏键盘
【发布时间】:2015-06-12 22:02:26
【问题描述】:

我正在尝试以编程方式在 Windows Metro 应用程序上显示/隐藏键盘。我最初认为我可以使用折叠的文本框并将焦点放在它上面。但在这个link 中似乎不允许这样做。该链接还讨论了实现此目的的 AutomationPeer 和 TextAutomationPeer。有没有关于如何使用这些的资源?

提前致谢 PK

【问题讨论】:

  • 此链接 (social.msdn.microsoft.com/Forums/ha-Latn-NG/winappswithcsharp/…) 表示您可以将焦点设置/移除到 Text Control 以显示/隐藏键盘。你到底想做什么?你能提供更多细节吗?如果您使用的是 Javascript,您可以尝试在您的文本框上放置 div 以使其“不可见”并对输入更改事件做出反应
  • 两个链接都谈到无法显示键盘:“”“这意味着应用程序无法通过控制焦点以编程方式调用触摸键盘。过去的罪魁祸首是网页——其中很多默认情况下将焦点设置到输入字段,但在他们的页面上还有许多其他体验可供用户享受。但是,我们认为要求用户点击输入字段是可以接受的折衷方案。"""
  • 为了启用用户驱动的调用,我们跟踪最后一个触摸事件的坐标,并将它们与当前具有焦点的元素的边界矩形的位置进行比较。如果该点包含在边界矩形内,则调用触摸键盘。
  • 我们要做的是拦截键盘输入并将其发送到服务器,服务器也可以指示客户端显示键盘。

标签: windows-8 microsoft-metro


【解决方案1】:

来自here

UI 自动化是开发人员交流的机制 特定的 UI 元素是否可以接收文本输入。你 必须确保在 您的应用程序,以便触摸键盘知道焦点时出现 落在特定的 UI 元素上。对于 Windows 提供的控件,此 将自动完成,因为适当的可访问性属性是 默认设置,但对于自定义控件和体验,您必须执行 正确设置可访问性属性的额外工作; 请记住,触摸键盘会对这些属性做出反应。

如果您使用 C# 或 C++,请使用 AutomationPeer 对象,特别是 TextAutomationPeer。 Windows 8 Release Preview 示例将 演示如何在 C# 中执行此操作。请记住,控件还必须 可编辑并且能够接收文本以使键盘调用,在 除了具有适当的辅助功能设置。表示 某些东西可以接收文本时它不能会误导 无障碍工具和依赖它们的用户。

为了启用用户驱动的调用,我们跟踪最后一个坐标 触摸事件并将它们与边界矩形的位置进行比较 当前具有焦点的元素。如果包含该点 在边界矩形内,触摸键盘被调用。

所以您无法以编程方式显示键盘。隐藏/显示键盘的适当方法是将控件设置为使用 AutomationPeer 对象接受输入。

来自here,如果您将输入控件设置为只读,则它不会触发键盘,因此您可以使用它来控制键盘何时打开。

编辑:

在实现文本自动化对等体时需要检查几件事:

  1. 确保您使用真实的触摸设备进行测试,或者使用带有基本触摸模式工具的模拟器进行测试。如果您不这样做,则自动化对等将不会激活,因为它仅由手写笔或触摸输入(不是鼠标)激活。

  2. 确保您的自定义控件实现 OnCreateAutomationPeer 类似这样的内容:

    受保护的覆盖 AutomationPeer OnCreateAutomationPeer() { 返回新的 CustomControl2AutomationPeer(this); }

  3. 确保您的 Automation Peer 实现 FrameworkElementAutomationPeerITextProviderIValueProvider

更多细节参见示例here

【讨论】:

  • 我不确定,但我认为即使是automationpeer 方法也不起作用。我试过了,但不能让它工作。
  • 我尝试在 Windows 8 PC 中运行带有文本框的 Metrostyle 应用程序。当点击文本框时,触摸键盘不会出现。为什么呢 ?还是在平板电脑上运行时会显示?
  • +1 不错的答案。如需参考,另请参阅Custom automation peers
【解决方案2】:

只需放置一个 TextBox 并将其隐藏。设置IsReadOnly = true 并将TextBox 的选项卡索引设置为0,因此键盘将专注于该TextBox 但它意识到TextBox 是只读的并且不会弹出。 :)

【讨论】:

    【解决方案3】:

    There 是自定义 AutomationPeer 的示例,这似乎有助于解决问题。

    创建程序化键盘逻辑的好指南。

    帮帮忙

    【讨论】:

      【解决方案4】:

      如果您添加一个文本框,然后选择属性> 在 Miscellaneos 下有一个名为 PreventKeyboardDisplayOnProgrammaticFocus 的属性,请检查该属性并设置文本框的焦点,如下所示:

       HiddenSearchBox.Focus(FocusState.Programmatic);
      

      【讨论】:

        【解决方案5】:

        这是我用来实现这一目标的小PowerShell 脚本。您可以在 C# 中通过获取服务并根据您的需要启动/停止它来执行相同的操作。

        $serv = get-ciminstance win32_service -filter "name = 'TabletInputService'"
        # if started stop it
        if( $serv.State.equals("Running") ){
            Stop-Service TabletInputService
        }
        # if not set to disabled, disable it
        # else set to auto and start
        if( !$serv.StartMode.equals("Disabled") ){
            Set-Service TabletInputService -StartupType Disabled
            "TabletInputService Disabled"
        }
        else {
            Set-Service TabletInputService -StartupType Auto
            Start-Service TabletInputService
            "TabletInputService Enabled and Started"
        }
        

        【讨论】:

        • 需要多少时间?我不再从事该产品的工作,但这似乎有点慢。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-10
        • 1970-01-01
        • 2011-02-04
        • 1970-01-01
        • 1970-01-01
        • 2020-07-07
        相关资源
        最近更新 更多