Есть ли способ обработки события GotFocus во всех текстовых полях во всех представлениях по соглашению?
Мы пишем приложение на основе WPF, которое обычно используется на сенсорном планшете. Мы разрабатываем пользовательский интерфейс, чтобы избежать ввода текста, но бывают случаи, когда этого нельзя избежать. Для тех времен мы хотим контролировать, когда и какой тип клавиатуры выдается для ввода.
Мы можем создать базовый пользовательский элемент управления, чтобы добавить соответствующий обработчик событий, но мне было интересно, есть ли способ сделать это по соглашению.
Мы используем CaliburnMicro для нашей инфраструктуры MVVM, и поскольку она поддерживает настройку соглашения, я начал изучать ConventionManager.AddElementConvention<TextBox>(null, null, "GotFocus")
но вызов этого заменит любые существующие соглашения. Я думал о чем-то вроде:
var textboxConvention = ConventionManager.GetElementConvention(typeof(TextBox));
var oldBinding = textboxConvention.ApplyBinding;
textboxConvention.ApplyBinding =
(viewModelType, path, property, element, convention) =>
{
element.GotFocus += ((o, args) => ShowKeyboard((TextBox)o));
element.LostFocus += ((o, args) => HideKeyboard((TextBox)o));
return oldBinding(viewModelType, path, property, element, convention);
};
... но я подозреваю, что я пошел по неверному пути здесь.
Есть ли лучший способ связывания цепей? Есть ли лучший способ обработки событий фокусировки / вызова клавиатуры?
2 ответа
Я делал это раньше. Вы можете создать прикрепленное поведение, которое прослушивает PreviewGotKeyboardFocus на рассматриваемом элементе, вызывая отображение OnScreenKeyboard. Затем создайте стиль, который применяет прикрепленное поведение к этим элементам управления. В моем проекте у нас также были разные клавиатуры для разных типов ввода (например, текст против чисел). Прикрепленное поведение устанавливает KeyboardType для его свойства. Основываясь на KeyboardType, я бы отобразил соответствующую клавиатуру.
Если вам нужна дополнительная помощь, дайте мне знать.
Я думаю, что GotFocus является всплывающим событием, поэтому вы можете добавить обработчик к окну или странице, а затем перехватить любые события GotFocus, которые всплывают в верхней части дерева элементов? Затем вы можете обрабатывать событие соответствующим образом или не обрабатывать его и разрешать другим зарегистрированным обработчикам обрабатывать его. Я думаю, единственная проблема заключается в том, что TextBox обрабатывает и глотает событие, и я не уверен в этом.
НТН,
Барт