Поле фокуса WPF MVVM на загрузке

Если вы используете 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.

Также см. Этот вопрос SO

48
задан Dave Clemmer 6 August 2011 в 21:51
поделиться

5 ответов

Если это заставляет вас чувствовать себя лучше (мне становится легче), вы можете сделать это в Xaml, используя прикрепленное свойство:

http://msdn.microsoft.com/en-us /library/system.windows.input.focusmanager.focusedelement.aspx

Все, что вы можете сделать в коде позади, вы можете сделать в Xaml, если вы знаете трюки. К счастью, вам не пришлось реализовывать этот трюк - MS сделала это за вас.

50
ответ дан 26 November 2019 в 18:48
поделиться

В этом случае я думаю, что можно поместить код в представление. Установка фокуса на элемент управления влияет на поведение пользовательского интерфейса, а не на логику приложения, и, следовательно, это ответственность представления.

14
ответ дан 26 November 2019 в 18:48
поделиться
  1. Имейте свойство в вашей ViewModel, которое указывает, какой элемент в данный момент сфокусирован.
  2. Используйте FocusManager для привязки к этому свойству.

     
    

Ваша ViewModel - это транслятор, который существует исключительно для предоставления информации в представление, поэтому вы можете добавлять в виртуальную машину любую информацию, которая необходима представлению для работы.

9
ответ дан 26 November 2019 в 18:48
поделиться

На самом деле, разве фокус не является проблемой пользовательского интерфейса? MVVM - это разделение проблем: то, что принадлежит модели, находится в модели, что принадлежит представлению, находится в поле зрения, и какая модель связывания и представление вместе находится во ViewModel (это, конечно, упрощенное описание).

Это означает, что логика пользовательского интерфейса остается в представлении - TextBox.Focus (), на мой взгляд, является подходящим способом сделать это.

8
ответ дан 26 November 2019 в 18:48
поделиться

Я бы рассмотрел элемент управления с фокусом как "только визуальный", поэтому не было бы никаких проблем, если бы он находился в коде.

Идея виртуальной машины такова. чтобы переместить логику из представления и предоставить удобную для привязки данных версию вашей модели для привязки представления. Это не обязательно означает, что весь код должен находиться в виртуальной машине, только логический код и все, что напрямую не связано с пользовательским интерфейсом.

4
ответ дан 26 November 2019 в 18:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: