2015-08-27 24 views
11

Mam aplikację WPF.NET 4.6 uruchomioną na tablecie Windows 8.1 i przez ostatnie kilka dni starałem się, aby moja aplikacja była przyjazna, aby działała zgodnie z oczekiwaniami. Moje główne problemy związane z fokusem mają wpływ na kilka elementów sterujących w mojej aplikacji. na przykład:WPF i touch - fokus problemu

  • Pola tekstowe: czasami wymaga podwójnego lub potrójnego dotyku w celu uzyskania fokusu wejściowego, wprowadzają mysz nad stanem, ale nie ma tam kija;
  • ComboBoxes: wymaga kilku dotknięć, aby je otworzyć, a po dotknięciu elementu, aby go wybrać, kombinacja pozostaje otwarta z podświetloną nowo wybraną pozycją;
    combobox focus problem
  • Przyciski: wykonuje kilka kliknięć, aby uruchomić podłączone polecenie i pozostać w stanie myszy nad stanem;
  • Obsługa klawiatury

Istnieje kilka podejść Próbowałem podczas poszukiwania rozwiązania, które każdy ma własne wady:

  • Zdejmowanie obsługę tabletu dla całej aplikacji (taken from here). ten problem rozwiązuje większość problemów z fokusem wspomnianych powyżej, ale sprawia, że ​​przewijanie (i jak sądzę inne funkcje związane z tabletem, których jeszcze nie znalazłem) jest bezużyteczne.
  • Jawnie aktywuje klawiaturę, gdy jest to wymagane (Example here). Skupienie problem pozostaje, przewijanie działa zgodnie z oczekiwaniami
  • Próbowałem też usunąć wszystkie style i przetestowany wszystko na 2 różnych tabletek pochodzących od różnych producentów, ale bez powodzenia

Ostatnio Microsoft announced że „Touch jest lepsze”, ale nie mogłem znajdź oficjalną dokumentację na temat najlepszego sposobu podejścia do tego tematu.

Wszelkie sugestie, jak poprawić działanie aplikacji za pomocą dotyku, będą bardzo pomocne.

Odpowiedz

1

udało mi się usunąć myszy nad stanem stosując następujące zachowanie:

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

Jak używać tego kodu? połączyć się ze zdarzeniem dotykowym sterowania? –