2012-08-27 15 views
15

Estoy desarrollando mi aplicación para Windows 8 en C#, y una cosa muy molesta es que el teclado táctil a veces permanece en la pantalla a pesar de que todos los cuadros de texto han perdido el foco.Windows 8 - Cómo descartar el teclado táctil?

He leído el artículo keyboard dismissal logic white paper, que explica que al cambiar de control a control, el teclado puede permanecer encendido aunque un control no acepte la entrada del teclado. Este sería mi caso porque todos mis contenidos están alojados en un GridView o un ListView. Cuando el usuario hace clic en cualquier elemento de la pantalla, el toque tocará estos controles. Esto es muy molesto porque el teclado ocupa la mitad de una pantalla y no hay forma de cerrar el teclado.

He intentado configurar el cuadro de texto para que se desactive y no haya afectado. La única forma de quitar el teclado es enfocar un botón, que es extremadamente raro.

Pensé que tenía que hacer algo con el "AutomationPeer", pero no tengo claro qué hacer exactamente. ¿Hay alguna manera de anular este comportamiento?

Edit: Me di cuenta de esto. El objetivo es cambiar al tipo de control del elemento GridView y GridView que no figura en el whitepaper. Aquí está el código de la cuadrícula que hice que me permitió ocultar el teclado:

public class KeyboardUnfocusableGridView : GridView 
{ 
    private class KeyboardUnfocusableGridViewAutomationPeer : GridViewAutomationPeer 
    { 
     public KeyboardUnfocusableGridViewAutomationPeer(GridView owner) 
      : base(owner) 
     { 
     } 

     protected override AutomationControlType GetAutomationControlTypeCore() 
     { 
      return AutomationControlType.Custom; 
     } 

    } 

    private class KeyboardUnfocusableGridViewItemAutomationPeer : GridViewItemAutomationPeer 
    { 
     public KeyboardUnfocusableGridViewItemAutomationPeer(GridViewItem owner) 
      : base(owner) 
     { } 

     protected override AutomationControlType GetAutomationControlTypeCore() 
     { 
      return AutomationControlType.Custom; 
     } 

    } 

    private class KeyboardUnfocusableGridViewItem : GridViewItem 
    { 
     protected override AutomationPeer OnCreateAutomationPeer() 
     { 
      var baseItem = base.OnCreateAutomationPeer(); 
      return new KeyboardUnfocusableGridViewItemAutomationPeer(this); 
     } 


    } 

    protected override AutomationPeer OnCreateAutomationPeer() 
    { 
     var baseItem = base.OnCreateAutomationPeer(); 
     return new KeyboardUnfocusableGridViewAutomationPeer(this); 
    } 

    protected override Windows.UI.Xaml.DependencyObject GetContainerForItemOverride() 
    { 
     return new KeyboardUnfocusableGridViewItem(); 
    } 
} 

Es desafortunado que tengo que escribir esta cantidad de código para hacer una cosa simple. Esto definitivamente no es óptimo, ya que necesitaría hacer esto para cada uno de los ItemsControl que necesito usar.

+0

Si la totalidad de su contenido se encuentra en un GridView o ListView, todo lo que necesita hacer es establecer la propiedad IsHitTestVisible a falso y sus cuadros de texto no podrán aceptar el foco, por lo que el teclado no aparecerá. Desafortunadamente, también perderás el desplazamiento. Solo un FYI ... –

+0

Gran solución, no tenía esperanza con este problema :). Y la misma técnica también funciona para ListView. –

+0

¿Puede mover su solución a una respuesta a continuación para que podamos obtener esto de la lista sin respuesta? Gracias. –

Respuesta

3

Lo que debe hacer es establecer el foco en cualquier control que no acepte la entrada de texto. Sin embargo, tenga en cuenta que si el usuario mostró el teclado de forma manual (en lugar de mostrarlo automáticamente porque un cuadro de texto recibió el foco), el teclado permanecerá abierto.

Compruebe hacia fuera esta muy buena hilo sobre el teclado en pantalla para obtener más información:

http://social.msdn.microsoft.com/Forums/pl/winappswithcsharp/thread/3c227262-1d2c-4382-9c50-5b71d2b5d823

+0

Esto no funcionó ya que todos mis controles están en un GridView o un ListView. De forma predeterminada, establecer el foco en un control en un GridView o un ListView no descarta el teclado. Creo que he descubierto una manera, que lo publico aquí en breve. – thisnick

+8

¿Definir en breve? – Spiked3

Cuestiones relacionadas