在Windows8上以编程方式显示/隐藏键盘

时间:2012-04-12 18:27:17

标签: windows-8 microsoft-metro

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

提前致谢 PK

5 个答案:

答案 0 :(得分:3)

来自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
  4. 示例here中提供了更多详细信息。

答案 1 :(得分:1)

只需放置一个TextBox并隐藏它。设置IsReadOnly = true并将TextBox的选项卡索引设置为0,因此键盘将关注该TextBox,但它实现TextBox是只读的,并且它不会加速。 :)

答案 2 :(得分:0)

There是自定义AutomationPeer的示例,它似乎对此问题很有帮助。

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

Holp可以提供帮助

答案 3 :(得分:0)

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

 HiddenSearchBox.Focus(FocusState.Programmatic);

答案 4 :(得分:-2)

这是我用来实现这个目标的小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"
}