Если вы используете Modernizr , очень просто использовать Modernizr.touch
, как упоминалось ранее.
Однако я предпочитаю использовать комбинацию Modernizr.touch
и тестирование пользовательского агента, просто чтобы быть в безопасности.
var deviceAgent = navigator.userAgent.toLowerCase();
var isTouchDevice = Modernizr.touch ||
(deviceAgent.match(/(iphone|ipod|ipad)/) ||
deviceAgent.match(/(android)/) ||
deviceAgent.match(/(iemobile)/) ||
deviceAgent.match(/iphone/i) ||
deviceAgent.match(/ipad/i) ||
deviceAgent.match(/ipod/i) ||
deviceAgent.match(/blackberry/i) ||
deviceAgent.match(/bada/i));
if (isTouchDevice) {
//Do something touchy
} else {
//Can't touch this
}
Если вы не используете Modernizr, вы можете просто заменить приведенную выше функцию Modernizr.touch
на ('ontouchstart' in document.documentElement)
Также обратите внимание, что тестирование пользовательского агента iemobile
даст вам более широкий диапазон обнаружил мобильные устройства Microsoft, чем Windows Phone
.
Если это заставляет вас чувствовать себя лучше (мне становится легче), вы можете сделать это в Xaml, используя прикрепленное свойство:
http://msdn.microsoft.com/en-us /library/system.windows.input.focusmanager.focusedelement.aspx
Все, что вы можете сделать в коде позади, вы можете сделать в Xaml, если вы знаете трюки. К счастью, вам не пришлось реализовывать этот трюк - MS сделала это за вас.
В этом случае я думаю, что можно поместить код в представление. Установка фокуса на элемент управления влияет на поведение пользовательского интерфейса, а не на логику приложения, и, следовательно, это ответственность представления.
Используйте FocusManager для привязки к этому свойству.
Ваша ViewModel - это транслятор, который существует исключительно для предоставления информации в представление, поэтому вы можете добавлять в виртуальную машину любую информацию, которая необходима представлению для работы.
На самом деле, разве фокус не является проблемой пользовательского интерфейса? MVVM - это разделение проблем: то, что принадлежит модели, находится в модели, что принадлежит представлению, находится в поле зрения, и какая модель связывания и представление вместе находится во ViewModel (это, конечно, упрощенное описание).
Это означает, что логика пользовательского интерфейса остается в представлении - TextBox.Focus (), на мой взгляд, является подходящим способом сделать это.
Я бы рассмотрел элемент управления с фокусом как "только визуальный", поэтому не было бы никаких проблем, если бы он находился в коде.
Идея виртуальной машины такова. чтобы переместить логику из представления и предоставить удобную для привязки данных версию вашей модели для привязки представления. Это не обязательно означает, что весь код должен находиться в виртуальной машине, только логический код и все, что напрямую не связано с пользовательским интерфейсом.