2015-08-27 11 views
11

Ho un'applicazione WPF.NET 4.6 in esecuzione su un tablet Windows 8.1 e negli ultimi giorni ho faticato a rendere l'app touch amichevole per farlo funzionare come previsto. I miei problemi principali sono legati alla messa a fuoco, questi riguardano diversi controlli nella mia app. ad esempio:WPF e touch - focus issue

  • Caselle di testo: a volte richiede un doppio o triplo tocco per ottenere il focus di input, entrano in un mouse sopra stato ma il cursore non è lì;
  • ComboBox: richiede un paio di tocchi per aprirlo e, una volta toccato un oggetto per selezionarlo, la combo rimane aperta con l'elemento appena selezionato evidenziato;
    combobox focus problem
  • Pulsanti: bastano un paio di clic per eseguire il comando connesso e rimanere nel mouse sullo stato;
  • Supporto tastiera

Ci sono un paio di approcci ho provato durante la ricerca di una soluzione che ognuno ha il proprio aspetti negativi:

  • Rimozione del supporto tablet per l'intera applicazione (taken from here). questo risolve la maggior parte dei problemi di messa a fuoco di cui sopra ma rende inutilizzabile lo scrolling (e credo che alcune altre funzionalità relative a Tablet che non ho ancora trovato).
  • Attivazione esplicita della tastiera quando richiesto (Example here). problema di messa a fuoco rimane, lo scorrimento funziona come previsto
  • Ho anche provato a rimuovere tutti gli stili e testato tutto su 2 compresse differenti di diversi produttori, ma senza successo

Recentemente Microsoft announced che "Touch è migliore" ma non ho potuto trovare una documentazione ufficiale sul modo migliore per affrontare questo argomento.

Qualsiasi suggerimento su come far funzionare meglio la mia applicazione con il tocco sarebbe di grande aiuto.

risposta

1

sono stato in grado di rimuovere il mouse sopra lo stato utilizzando seguente comportamento:

public class TouchDeviceMouseOverUIElementFixBehavior : Behavior<UIElement> 
{ 
    protected override void OnAttached() 
    { 
     AssociatedObject.StylusUp += AssociatedObject_StylusUp; 
    } 

    protected override void OnDetaching() 
    { 
     AssociatedObject.StylusUp -= AssociatedObject_StylusUp; 
    } 

    private void AssociatedObject_StylusUp(object sender, StylusEventArgs e) 
    { 
     var control = sender as FrameworkElement; 
     if (control != null) 
     { 
      if (!VisualStateManager.GoToElementState(control, "Normal", true)) 
      { 
       VisualStateManager.GoToState(control, "Normal", true); 
      } 
     } 
    } 
} 
+1

Come si usa questo codice? connettersi ai controlli touch event? –