2015-08-27 4 views
11

У меня есть приложение, работающее на планшете Windows 8.1, и за последние несколько дней я изо всех сил старался сделать свое приложение touch дружественным, чтобы оно работало должным образом. Мои основные проблемы связаны с фокусом, они влияют на несколько элементов управления в моем приложении. например:WPF и touch - focus issue

  • Текстовые ящики: иногда требуется двойное или тройное касание, чтобы получить фокус ввода, они вводят мышь над состоянием, но карет не существует;
  • ComboBoxes: требуется несколько касаний, чтобы открыть его, и после касания элемента, чтобы выбрать его, комбо остается открытым с выбранным выделенным элементом;
    combobox focus problem
  • Кнопки: требуется несколько щелчков, чтобы выполнить подключенную команду и оставаться в мыши над состоянием;
  • Поддержка клавиатуры

Есть несколько подходов, я пытался при поиске решения, что каждый имеет собственные недостатки:

  • Удаление поддержки планшета для всего приложения (taken from here). это решает большинство упомянутых выше проблем фокуса, но делает прокрутку (и я предполагаю, что некоторые другие функции, связанные с Tablet, которые я еще не нашел) непригодны для использования.
  • Явная активация клавиатуры при необходимости (Example here). Фокус остается проблема, прокрутка работает, как ожидалось
  • Я также попытался удалить все стили и протестированы все на 2-х разных таблеток от разных производителей, но без успеха

Недавно Microsoft announced, что «Touch лучше» Но я не мог найти любую официальную документацию о наилучшем способе подхода к этой теме.

Любое предложение о том, как заставить мое приложение работать лучше с прикосновением, будет большой помощью.

ответ

1

Я был в состоянии удалить мыши на состояние, используя следующее поведение:

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

Как вы используете этот код? подключиться к событиям сенсорного управления? –